Python 3.4 で上位 2 つの回答のベンチマークを行ったところ、多くの状況下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
インポートを 2 つの関数の外に置いても , を返す場合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