Изменчивый заданной длины с циклическим добавлением и нарезкой - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть список data_list, который должен оставаться определенной длины x все время.Я получаю новую информацию каждый определенный промежуток времени, а затем выполняю следующие действия:

new_info  # type: list
data_list.extend(new_info)
del data_list[:len(new_info)]

, однако это очень медленно (я думаю, что del del копирует весь список).

Кроме того, после каждой циклической вставки я разрезаю список и выполняю все виды числовых вычислений, используя numpy.Это означает, что каждый раз я создаю новый массив для вычислений.

что бы вы порекомендовали?Не имеет значения, если рекомендуемой структуры данных нет в стандартной библиотеке.

Примечание: у меня нет всех new_info в начале, поэтому это не может быть сделано вПакетная манера.


моя попытка

import sys
import itertools
from typing import Iterable
from collections import deque

class SetLengthDeque(deque):
    def __getitem__(self, s):
        # for me the common case is a slice so i prefer this, 
        # rather then check the type of s each time
        try:
            start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1
            return list(itertools.islice(self, start, stop, step))
        except AttributeError:  # not a slice but an int
            return self[s]

однако deque на самом деле является связанным списком и циклическим массивом.При вставке он примерно на 2 порядка быстрее, однако при нарезке он в 7 раз медленнее, чем список.Кроме того, мне все еще нужно создавать массивный массив каждую итерацию.

1 Ответ

0 голосов
/ 28 ноября 2018

Я думаю data_list = data_list[len(new_info):] это хорошо.Доступ к слайсам O (n).

Вот в чем дело, я думаю, что ни одно из них строго не соответствует вашим требованиям, потому что между строками 2 и 3 есть (предположительно крошечный) интервал, где список lenlen(data_list) + len(new_info).

data_list.extend(new_info) # Arbitrarily long
data_list[len(new_info):]

Что если мы сделаем все это одновременно?

data_list = data_list.extend(new_info)[len(new_info):]

extend не имеет возвращаемого значения, поэтому мы получаем ошибку.

Редактировать: это, кажется, справиться с этим, но я не проверил это полностью

if len(new_info) < len(data_list):
  data_list.extend(new_info)
  data_list[len(new_info):]
else:
  data_list = new_info[0-len(data_list):]
data_list

Редактировать еще раз: я также попробовал это с deque на joshrogan

d = deque(data_list, maxlen=len(data_list))
j = deque([x for x in range(30)])
d.extend(j)

Я думаю, одиниз них, вероятно, более производительный, чем другие в вашем случае использования, и было бы интересно услышать об этом!

...