我有以下Python3 MWE:
import collections
N = 5
d = collections.deque(maxlen=N)
d.append(1)
d.append(2)
d.append(3)
for x,y in zip(list(d)[::-1], list(d)[::-1][1:]):
print(x-y)
双端队列反转,并且将最近添加的项目与其邻居进行比较,直到所有邻居都进行比较(最大比较数为N-1)。
有没有更有效的方法?我认为我的解决方案是Pythonic,但我无法判断效率。
答案 0 :(得分:1)
您的程序需要双端队列吗? 我会使用numpy方法,这要快得多 (数量更多,非常有意义)
import numpy as np
arr = np.array([1,2,3,5,8,13,21])
print(arr[1:] - arr[0:-1])
我的代码花了220 ns 您的方法花费了812 ns 而且差异会随着数据量的增加而增加
我会注意到,将其追加到numpy数组中并不是很有效, 追加到列表(是O(1))并将其转换为np数组 np数组追加为O(N)
答案 1 :(得分:1)
在处理双端队列对象时避免创建列表会更有效(快1.3倍):
prevd = iter(reversed(d))
next(prevd)
for value,previous in zip(reversed(d), prevd):
print(value-previous)
如果您从双端队列中的数据开始并生成差异列表,这将比使用numpy更快(因为创建numpy数组并将结果返回到最后的列表会产生开销)。您将不得不一路致力于numpy以获得其全部好处,但随后您可能最终会为其他操作(例如追加到数组)付出更高的代价