я сделал скамью-начертание двух верхних ответов с Python 3.4 и я нашел itertools.accumulate
быстрее, чем numpy.cumsum
при многих обстоятельствах, часто гораздо быстрее. Однако, как вы можете видеть из комментариев, это может быть не всегда так, и трудно исчерпывающе изучить все варианты. (Не стесняйтесь добавить комментарий или отредактировать этот пост, если у вас есть дополнительные результаты для сравнения.)
Некоторые тайминги ...
Для коротких списков accumulate
составляет около 4 раза быстрее:
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
Для более длинных списков accumulate
около 3 раза быстрее:
l = [1, 2, 3, 4, 5]*1000
timeit(lambda: sum1(l), number=100000)
# 19.174508565105498
timeit(lambda: sum2(l), number=100000)
# 61.871223849244416
Если numpy
array
не приводится к list
, accumulate
является еще примерно в 2 раза быстрее:
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
Если поставить импорт за пределами этих двух функций и по-прежнему возвращают numpy
array
, accumulate
еще почти в 2 раза быстрее:
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
Примечание: не вызывайте список «list». Это имя встроенной функции, используемой для преобразования других вещей в списки, и вы не хотите скрывать это. – abarnert
См. Также http://stackoverflow.com/q/9258602 – hpaulj