Для таких больших структур данных numpy будет хорошо работать. В этом примере это более чем в 200 раз быстрее (см. Ниже) и немного проще для кодирования, в основном просто
add.accumulate(diff)
Сравнение между обработкой списка и прямым списком:
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 , вместо того, чтобы бросать свои собственные, как кажется, что вы делаете здесь.
Кроме того, здесь я предлагаю вам прочитать в данных с местом для предварительно начального термина, а не перестраивать список с предварительно определенным термином, разумеется, так что вам не нужно делать копию.