Le liste di comprensione in Python si riducono in modo efficiente in termini di memoria?
Domanda
Sono un principiante in Python e questo è il mio primo post, quindi non essere troppo duro :).Ultimamente ho giocato con Python e mi chiedevo se qualcosa di simile
max([x for x in range(25)])
comporterebbe che Python crei prima un elenco di tutti gli elementi e poi trovi il massimo, risultando in tempo O (2n), oppure terrebbe traccia del massimo mentre itera per Θ (n).Inoltre, poiché l'intervallo è diverso in Python3 (essendo un iterabile), questo lo renderebbe diverso rispetto a Python2?
Soluzione
Il tuo esempio farà sì che Python crei prima l'intero elenco.Se vuoi evitarlo, puoi usare invece un'espressione del generatore:
max((x for x in range(25)))
o semplicemente:
max(x for x in range(25))
Ovviamente (in Python 2), range
stesso crea un intero elenco, quindi quello che vuoi veramente in questo caso è:
max(x for x in xrange(25))
Tuttavia, per quanto riguarda il tempo impiegato, tutte queste espressioni hanno la stessa complessità.La differenza importante è che l'ultimo richiede uno spazio O (1), mentre gli altri richiedono uno spazio O (n).
Altri suggerimenti
Le liste di comprensione generano sempre una lista (a meno che qualcosa non generi un'eccezione).L'uso di un genex è invece consigliato nella maggior parte dei casi.
max(x for x in xrange(25))