更快地从列表中删除项目的方法

时间:2016-06-17 00:54:47

标签: python list memory time big-o

我有一个长度约为10M的列表。每个索引都包含一个字典

所以......例如......

l = [{'id': 'y'}, {'id', 'x'}, {'id', 'z'} ... ]

我有另一个列表,其中包含我要删除的项目

m = ['y', 'z']

我试过

l = [i for i in l if i['id'] not in m]

但正如预期的那样O(n^3)的运行时间并不令人惊讶。 我的第二种方法是创建一个新的字典来存储我想删除的项目的索引:

temp = {'y': 0, 'z': 2, ... }

for i in range(0, len(temp)):
    del l[temp[m[-1]]]
    del m[-1]

这确实改善了A LOT的执行时间(对于1M的数据集,从大约一小时到几秒或几分钟)。但是因为我在某处存储了索引,所以使用的内存相当高

我的问题是:是否有更有效的方法在O(n)时间内从大型列表中删除项目但又没有使用这么多内存?

2 个答案:

答案 0 :(得分:2)

我怀疑你会比以前更好:

s = set(m)
l = [i for i in l if i['id'] not in s]

这可能会比创建循环和一次删除一个项目快得多。通常在内存和速度之间进行权衡 - 这应该相当快,但是在创建新内存时将使用最多两倍的内存。

警告:当我说"我怀疑你会比...更好。"我正在谈论标准Python。像Pandas或Numpy这样的数字库在内存和时间方面都可能做得更好。

答案 1 :(得分:1)

如果只能在列表temp

中存储要删除的索引
temp = [0,2,...]

然后这可以更快地运作

np.delete(l,temp)