Forum
>>
Programmazione Python
>>
Scripting
>>
consiglio in stile funzionale
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da marcello |
2017-01-02 05:28:45 - consiglio in stile funzionale
|
Ciao,
sto scrivendo da poco codice in stile funzionale ed avrei qualche dubbio per tradurre if obsoleto: print('aggiorna') aggiorna() è meglio scrivere: 1. obsoleto and print('aggiorna') is None and aggiorna() 2. obsoleto and not print('aggiorna') and aggiorna() 3. obsoleto and (print('aggiorna') or aggiorna()) La (1) forse è più leggibile, la (2) sembra non voler stampare ma è più concisa e la (3) ancora di più, ma può trarre in inganno. Qual'è la migliore soluzione? Ce ne sono altre? Buon anno e grazie. |
|
Scritto da Claudio_F |
2017-01-05 12:10:01 - Re: consiglio in stile funzionale
|
La 3 è più concisa ma richiede un passaggio mentale in più (la soluzione dell'OR).
Personalmente trovo più leggibile la prima, magari abbreviata in: obsoleto and [print('aggiorna')] and aggiorna() *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione *** |
|
Scritto da marcello |
2017-01-05 14:00:27 - Re: consiglio in stile funzionale
|
Bella!
Mi piace e mi offre lo spunto per affrontare un altro nodo, che da tempo dovrei sciogliere: lista o tupla? Nel codice scritto sopra genero una lista, che si prende spazio in memoria dati per 4 elementi (in previsione di eventuali aggiunte che non verranno mai fatte). Non è più economica la soluzione: obsoleto and (print('aggiorna'),) and aggiorna()generando una tupla che prende spazio in memoria programma, veloce e senza neppure scomodare il kernel, per 1 solo elemento invariabile? Propongo un altro esempio: Devo passare ad una funzione un argomento composto da una lista che non verrà modificata. funzione([oggetto.nome for oggetto in listaoggetti]) Ma non è migliore, in ogni senso, scrivere: funzione(tuple(oggetto.nome for oggetto in listaoggetti))? |
|
Scritto da Claudio_F |
2017-01-05 20:54:41 - Re: consiglio in stile funzionale
|
Non credo che quella tupla occupi solo "memoria programma" come se fosse una const in C. Bisognerebbe vedere il decompilato bytecode, ma credo che, al pari della lista, venga creata a runtime ad ogni valutazione dell'espressione logica. Peggio ancora, potrebbe essere ricreata ogni volta anche la stringa. Da quanto leggo le ottimizzazioni pensate come se si stesse lavorando con allocazione statica non hanno molto senso in Python o potrebbero avere un controintuitivo effetto opposto (non conoscendo esattamente cosa gira sotto).
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione *** |
|
Scritto da marcello |
2017-01-06 23:56:43 - Re: consiglio in stile funzionale
|
|
|
Scritto da marcello |
2017-01-07 00:09:45 - Re: consiglio in stile funzionale
|
Mi scuso per il messaggio rotto in due parti, ma ho ancora problemi con l'editor del forum (come si esce da quote?)
Infatti il codice non fa parte del testo del libro, l'ho scritto io, ... e si vede! Spero di avere trascritto in modo corretto (NO copia incolla dal testo in prestito) e soprattutto di non aver infranto i diritti d'autore! In ogni caso si può ben vedere dal test che occorre il 32% di tempo in più per allocare una lista piuttoto che una tupla, differenza che aumenta con liste più piccole, per liste monodimesionali (range(1)) è addirittura il 52%! Quindi tante piccole tuple, quando possibile, migliorano le prestazioni. Senza parlare dell'occupazione di memoria, come si vede dalla tabella di allocazione. |
|
Scritto da marcello |
2017-01-07 00:50:42 - Re: consiglio in stile funzionale
|
(mi riscuso per l'interruzione, il gelo intorpidisce le dita.)
dicevo: l'occupazione di memoria della lista prevede lo spazio per l'aggiunta di altri elementi, forse solo se si usa append, ma credo sia implicito l'uso di append (questa parte non l'ho ben chiara). Sicuramente, quando lo spazio riservato per le aggiunte termina, la lista verrà copiata e riallocata in un nuovo spazio di memoria contiguo, altro tempo da aggiungere e inevitabile frammentazione della memoria. Comunque devo ringraziarti, la soluzione al problema è semplice e bella! e se non mi sbaglio la lista generata, non essendo assegnata, verrà cancellata ben presto. Peccato che la mia variante abbia quella virgola, ...fastidiosa. Mica si può avere tutto! (se non conosci Mica: "L'el fradel del Pota"). |
Pagina: 1
Esegui il login per scrivere una risposta.