在Python中从dict中删除某些键的最快方法

2024-10-06 11:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找在python dict中删除某些键的最快/最有效的方法

这里有一些选择

for k in somedict.keys(): 
    if k.startswith("someprefix"): 
        del somedict[k]

或者

dict((k, v) for (k, v) in somedict.iteritems() if not k.startswith('someprefix'))

逻辑上,第一个片段在较小的dict上应该更快,它不创建dict的副本,而是创建一个所有键的列表,但是双重查找和dict重建是非常耗时的。而第二个是更快的更大的听写,但需要2倍的内存。 我已经在一些小基准中检查了我的假设。

快一点吗?


Tags: 方法in列表forif副本not逻辑
2条回答

不仅del更容易理解,而且似乎比pop()稍快:

$ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "for k in d.keys():" "  if k.startswith('f'):" "    del d[k]"
1000000 loops, best of 3: 0.733 usec per loop

$ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "for k in d.keys():" "  if k.startswith('f'):" "    d.pop(k)"
1000000 loops, best of 3: 0.742 usec per loop

编辑:感谢Alex Martelli提供了如何进行基准测试的指导。希望我没有在任何地方滑倒。

首先测量复制所需的时间:

$ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()"
1000000 loops, best of 3: 0.278 usec per loop

复制的dict上的基准:

$ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()" "for k in d1.keys():" "  if k.startswith('f'):" "    del d1[k]"
100000 loops, best of 3: 1.95 usec per loop

$ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()" "for k in d1.keys():" "  if k.startswith('f'):" "    d1.pop(k)"
100000 loops, best of 3: 2.15 usec per loop

减去复制成本,我们得到pop()的1.872 usec和del的1.672 usec。

如果dict足够大,那么可以生成一个全新的dict。

dict((k, v) for (k, v) in somedict.iteritems() if not k.startswith('someprefix'))

相关问题 更多 >