Что лучше: дек или список нарезки? - PullRequest
0 голосов
/ 11 июня 2018

Если я использую код

from collections import deque
q = deque(maxlen=2)
while step <= step_max:
    calculate(item)
    q.append(item)
    another_calculation(q)

, как он сравнивается по эффективности и удобочитаемости с

q = []
while step <= step_max:
    calculate(item)
    q.append(item)
    q = q[-2:]
    another_calculation(q)

calculate() и another_calculation() в данном случае не реально, но вМоя настоящая программа - это просто два расчета.Я делаю эти вычисления каждый шаг за миллионы шагов (я моделирую ион в 2-м пространстве).Поскольку шагов так много, q становится очень длинным и использует много памяти, в то время как another_calculation() использует только два последних значения q.Я использовал последний метод, потом услышал упоминание deque и подумал, что он может быть более эффективным;таким образом, вопрос.

Т.е. как deques в python сравнивается с обычным нарезанием списка?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Если я правильно интерпретирую ваш вопрос, у вас есть функция, которая вычисляет значение, и вы хотите выполнить другой расчет с этим и предыдущим значением.Лучше всего использовать две переменные:

while step <= step_max:
    item = calculate()
    another_calculation(previous_item, item)
    previous_item = item

Если вычисления представляют собой какую-либо форму векторной математики, вам следует рассмотреть возможность использования numpy.

0 голосов
/ 11 июня 2018
q = q[-2:]

теперь это дорогостоящая операция, потому что она каждый раз воссоздает список (и копирует ссылки).(Здесь неприятный побочный эффект заключается в том, что он меняет ссылку на q, даже если вы можете использовать q[:] = q[-2:], чтобы избежать этого).

Объект deque просто меняет начало указателя списка и "забывает "самый старый предмет.Так что это быстрее и это одно из применений, для которых оно было разработано.

Конечно, для 2 значений нет большой разницы, но для большего числа есть.

...