このような大きなデータ構造の場合、numpyはうまく機能します。この例では、200倍以上高速で(以下を参照)、コーディングが少し簡単です。基本的には
add.accumulate(diff)
numpyと直接リスト操作の比較:
import numpy as nx
import timeit
N = 10000
diff_nx = nx.zeros(N, dtype=nx.int)
diff_py = list(diff_nx)
start = 1005
def f0():
orig = [start]
for x in diff_py:
orig.append(orig[-1] + x)
def f1():
diff_nx[0] = start
nx.add.accumulate(diff_nx)
t = timeit.Timer("f0()", "from __main__ import f0, f1, diff_nx, diff_py, nx, start")
print t.timeit(number=1000)
t = timeit.Timer("f1()", "from __main__ import f0, f1, diff_nx, diff_py, nx, start")
print t.timeit(number=1000)
与える
13.4044158459 # for list looping
0.0474112033844 # for numpy accumulate
ただし、実際には、ここで行っているように独自にローリングするよりも、PyTablesで簡単に実行できるような確立された圧縮アルゴリズムを再利用する方がよいようです。
また、ここでは、もちろん、追加された用語でリストを再構築するのではなく、追加された開始用語の余地があるデータを読み込むことをお勧めします。そのため、コピーを行う必要はありません。