比较反向双端队列中的邻居

时间:2019-05-18 09:59:59

标签: python algorithm performance collections deque

我有以下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,但我无法判断效率。

2 个答案:

答案 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以获得其全部好处,但随后您可能最终会为其他操作(例如追加到数组)付出更高的代价