Для таких больших структур данных numpy будет работать хорошо. Для этого примера, это над 200x быстрее (смотри ниже), и немного проще кода, в основном только
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, r а не катиться, как будто кажется, что ты здесь.
Кроме того, здесь, я предлагаю, чтобы вы читали данные с комнатой для предшествующего стартового условия, а не перестраивали список с добавленным сроком, конечно, чтобы вам не нужно было делать копию.
У меня это было и у меня в голове. Но он отказался от мысли, что карта и лямбда более эффективны, чем цикл. Может быть, я ошибаюсь :( – sudhakar
@sudhakar: В Python лямбда очень неэффективна - вызовы функций медленны, а вызовы анонимных функций еще медленнее. –
@fsanches: в некоторых случаях понимание списков происходит быстрее, но в этом случае (создание списка с использованием предыдущих значений) будет значительно медленнее, потому что для этого потребуются промежуточные списки. –