【发布时间】:2018-11-28 17:07:38
【问题描述】:
我有一个列表data_list,它应该一直保持一定长度x。
我每隔一定的时间间隔获取新信息,然后执行以下操作
new_info # type: list
data_list.extend(new_info)
del data_list[:len(new_info)]
但是这非常很慢(我认为 del 部分复制了整个列表)。
此外,在每次循环插入后,我都会对列表进行切片并使用 numpy 执行各种数值计算。 这意味着每次,我都会为计算创建一个新的 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 倍。
另外,我仍然必须在每次迭代时创建一个 numpy 数组。
【问题讨论】:
-
使用一个 numpy 数组并从前一个数组的切片视图和丢失/新元素中创建一个新数组。
-
这会不会像列表中的迭代一样慢?我基本上将在每次迭代时复制
data_list -
使用
deque可能吗?您可以在创建时设置最大长度。 -
@ParitoshSingh 不,使用数组不会让任何事情变得更快。事实上,你更有可能从复制中获得可怕的效率。一维数组切片与列表没有任何关系,这使得它可行
-
numpy 切片很漂亮。我认为只要您不迭代它,您就会看到收益。 @moshevi 这个想法也是你不把删除当作一个切片来处理。