ho fatto una panchina-mark dei primi due risposte con Python 3.4 e ho trovato itertools.accumulate
è più veloce di numpy.cumsum
in molte circostanze, spesso molto più veloce. Tuttavia, come puoi vedere dai commenti, questo potrebbe non essere sempre il caso, ed è difficile esplorare esaustivamente tutte le opzioni. (Sentiti libero di aggiungere un commento o modificare questo post se hai ulteriori risultati di riferimento di interesse.)
Alcuni tempi ...
Per brevi liste accumulate
è di circa 4 volte più veloce:
from timeit import timeit
def sum1(l):
from itertools import accumulate
return list(accumulate(l))
def sum2(l):
from numpy import cumsum
return list(cumsum(l))
l = [1, 2, 3, 4, 5]
timeit(lambda: sum1(l), number=100000)
# 0.4243644131347537
timeit(lambda: sum2(l), number=100000)
# 1.7077815784141421
Per gli elenchi più lunghi accumulate
è di circa 3 volte più veloce:
l = [1, 2, 3, 4, 5]*1000
timeit(lambda: sum1(l), number=100000)
# 19.174508565105498
timeit(lambda: sum2(l), number=100000)
# 61.871223849244416
Se il numpy
array
non è gettato a list
, accumulate
è ancora circa 2 volte più veloce:
from timeit import timeit
def sum1(l):
from itertools import accumulate
return list(accumulate(l))
def sum2(l):
from numpy import cumsum
return cumsum(l)
l = [1, 2, 3, 4, 5]*1000
print(timeit(lambda: sum1(l), number=100000))
# 19.18597290944308
print(timeit(lambda: sum2(l), number=100000))
# 37.759664884768426
Se si mettono le importazioni al di fuori delle due funzioni ed ancora restituire un numpy
array
, accumulate
è ancora quasi 2 volte più veloce:
from timeit import timeit
from itertools import accumulate
from numpy import cumsum
def sum1(l):
return list(accumulate(l))
def sum2(l):
return cumsum(l)
l = [1, 2, 3, 4, 5]*1000
timeit(lambda: sum1(l), number=100000)
# 19.042188624851406
timeit(lambda: sum2(l), number=100000)
# 35.17324400227517
Nota a margine: non chiamare un elenco 'lista'. Questo è il nome della funzione built-in utilizzata per convertire altre cose in elenchi e non si desidera nasconderlo. – abarnert
Vedere anche http://stackoverflow.com/q/9258602 – hpaulj