我有一个长度约为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)
时间内从大型列表中删除项目但又没有使用这么多内存?
答案 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)