si può facilmente verificare questo utilizzando il modulo timeit
. Per il vostro esempio particolare, la prima soluzione basata su len
sembra essere più veloce:
$ python --version
Python 2.7.10
$ python -m timeit -s "x = [10,60,20,66,79,5]" "len([i for i in x if 60 < i < 70])"
1000000 loops, best of 3: 0.514 usec per loop
$ python -m timeit -s "x = [10,60,20,66,79,5]" "sum(i for i in x if 60 < i < 70)"
1000000 loops, best of 3: 0.693 usec per loop
Anche per le liste più grandi - ma con la maggior parte degli elementi che non corrisponde alla predicato - appare la versione len
di non essere più lenta:
$ python -m timeit -s "x = [66] + [8] * 10000" "len([i for i in x if 60 < i < 70])"
1000 loops, best of 3: 504 usec per loop
$ python -m timeit -s "x = [66] + [8] * 10000" "sum(1 for i in x if 60 < i < 70)"
1000 loops, best of 3: 501 usec per loop
infatti, anche se la maggior parte degli elementi della data partita lista (quindi un grande elenco dei risultati è costruito da passare al len
), le vittorie len
versione:
$ python -m timeit -s "x = [66] + [65] * 10000" "len([i for i in x if 60 < i < 70])"
1000 loops, best of 3: 762 usec per loop
$ python -m timeit -s "x = [66] + [65] * 10000" "sum(1 for i in x if 60 < i < 70)"
1000 loops, best of 3: 935 usec per loop
Tuttavia, ciò che sembra essere molto più veloce è non avere una lista in primo luogo, se possibile, ma piuttosto contenere per es. a collections.Counter
. Per esempio.per 100000 elementi, ottengo:
$ python -m timeit -s "import collections; x = [66] + [65] * 100000" "len([i for i in x if 60 < i < 70])"
100 loops, best of 3: 8.11 msec per loop
$ python -m timeit -s "import collections; x = [66] + [65] * 100000; d = collections.Counter(x)" "sum(v for k,v in d.items() if 60 < k < 70)"
1000000 loops, best of 3: 0.761 usec per loop
In realtà * è necessario * l'elenco? In caso contrario, la seconda versione evita di crearla. – jonrsharpe
La maggior parte dei pythonic non implica meno tempo/memoria, ma tu chiedi entrambi nella tua domanda. Vuoi sapere qual è il più pitone o il più efficiente? –
Puoi anche usare 'if in range (61, 70)'. –