python - 在 Python 中从字典中删除某些键的最快方法

标签 python dictionary filter

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

这里有一些选项

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'))

从逻辑上讲,第一个片段在较小的字典上应该更快,它不会创建字典的副本,而是创建所有键的列表,但是双重查找和字典重建非常耗时。虽然第二个在更大的字典上更快,但需要 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

复制字典的基准:

$ 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。

关于python - 在 Python 中从字典中删除某些键的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3077145/

相关文章:

python - Mac OS 上 "Segmentation fault"期间的 "import cv"

python - 对多个 Excel 工作簿使用相同的格式设置变量

python - 按值的长度对字典进行排序

javascript - 理解 javascript 对象与 map

javascript - 使用 Angular.js 高级过滤数据

python - 具有时间序列的 Keras CategoryEncoding 层

python - CRC32计算

python - 如何从字典有效构建数据框(pandas)

arrays - 过滤器不会迭代数组中的所有元素。为什么?

primefaces - 如何自定义 SelectOneMenu 的过滤功能