我正在寻找删除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'))
逻辑上,第一个片段在较小的dicts上应该更快,它不会创建dict的副本但会创建所有键的列表,但是双重查找和dict重建是耗时的。虽然第二个在更大的dicts上更快,但需要2倍的内存。 我已经在一些小基准测试中检查了我的假设。
还有什么更快的?
答案 0 :(得分:12)
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
复制词典的基准:
$ 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。
答案 1 :(得分:9)
如果dict足够大,那么生成一个全新的dict可能是有意义的。
dict((k, v) for (k, v) in somedict.iteritems() if not k.startswith('someprefix'))