Сравните Соседи в Обратном Deque - PullRequest
0 голосов
/ 18 мая 2019

У меня есть следующий 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)

Deque переворачивается, и последние добавленные элементы сравниваются со своими соседями, пока не будут сравнены все соседи (максимальное количество сравнений - N-1).

Есть ли более эффективный способ сделать это? Я думаю, что мое решение довольно Pythonic, но я не могу судить об эффективности.

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Избегать создания списков при обработке объектов deque было бы более эффективно (в 1,3 раза быстрее):

prevd = iter(reversed(d))
next(prevd)
for value,previous in zip(reversed(d), prevd):
    print(value-previous)

Если вы начинаете с данных в deque и создаете список различий,это будет быстрее, чем использование numpy (из-за накладных расходов, связанных с созданием массива numpy и превращением результата обратно в список в конце).Вам придется взять на себя обязательство полностью использовать numpy, чтобы получить все его преимущества, но тогда вы можете в конечном итоге заплатить более высокую цену за другие операции, такие как добавление в массив

1 голос
/ 18 мая 2019

вам нужна деку для вашей программы?Я хотел бы пойти с NumPy подход, который гораздо быстрее (в большем числе его очень важно)

import numpy as np
arr = np.array([1,2,3,5,8,13,21])
print(arr[1:] - arr[0:-1]) 

мой код занял 220 нс, ваш метод занял 812 нс, и разница будет расти с количеством данных

Я хотел бы отметить, что добавление в массив numpy неэффективно, вы хотите добавить в список (который является O (1)) и преобразовать его в массив np. Добавление массива np O (N)

...