python - 在 python 中更新字典的最快方法

标签 python dictionary performance hashtable

我有一个字典 A 和一个可能的条目 foo。我知道 A[foo] 应该等于 x,但我不知道 A[foo] 是否已经定义。在任何情况下,如果 A[foo] 已被定义,则意味着它已经具有正确的值。

执行速度更快:

if foo not in A.keys(): 
   A[foo]=x 

或者简单地更新

A[foo]=x 

因为当计算机找到 foo 条目时,它也可以更新它。如果不是,我将不得不调用哈希表两次?

谢谢。

最佳答案

只需将项目添加到字典中而不检查它们是否存在。我使用 3 种不同的方法将 100,000 个项目添加到字典中,并使用 timeit 模块对其进行计时。

  1. 如果 k 不在 d 中:d[k] = v
  2. d.setdefault(k, v)
  3. d[k] = v

选项 3 是最快的,但不是很多。

[ 实际上,我也试过 if k not in d.keys(): d[k] = v,但是速度慢了 300 倍(每次迭代都构建了一个键列表并执行线性搜索)。它让我的测试变得如此缓慢,以至于我把它留在了这里。 ]

这是我的代码:

import timeit

setup = """
import random
random.seed(0)
item_count = 100000
# divide key range by 5 to ensure lots of duplicates 
items = [(random.randint(0, item_count/5), 0) for i in xrange(item_count)]
"""
in_dict = """
d = {}
for k, v in items:
    if k not in d:
        d[k] = v
"""
set_default = """
d = {}
for k, v in items:
    d.setdefault(k, v)
"""
straight_add = """
d = {}
for k, v in items:
    d[k] = v
"""
print 'in_dict      ', timeit.Timer(in_dict, setup).timeit(1000)
print 'set_default  ', timeit.Timer(set_default, setup).timeit(1000)
print 'straight_add ', timeit.Timer(straight_add, setup).timeit(1000)

结果:

in_dict       13.090878085
set_default   21.1309413091
straight_add  11.4781760635

注意: 这一切都毫无意义。我们每天都会收到很多关于在 Python 中执行 x 或 y 的最快方法的问题。在大多数情况下,很明显问题是在遇到任何性能问题之前提出的。我的建议?专注于编写您可以编写的最清晰的程序,如果它太慢,请对其进行概要分析并在需要的地方进行优化。根据我的经验,我几乎从来没有去分析和优化步骤。从问题的描述来看,字典存储似乎不是您程序中的主要瓶颈。

关于python - 在 python 中更新字典的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4156392/

相关文章:

python - Django URL 正则表达式接受任何数字或直到 99 的任何数字

Python:如何将列表切片为特定值

swift - 用于 nil 过滤的通用 Swift 字典扩展

swift - 如何转换 [String :Int] to [String:Double]

javascript - 找到匹配项后防止在 jQuery 中向下遍历

MySQL 大表 JOIN 使数据库崩溃

c++ - 测量 Visual Studio Enterprise 2017 (C++) 中的函数执行时间

python - 为什么 numpy 在导入和 pydoc 时给出 "segmentation fault"?

python - 如何提高这种numpy迭代的效率?

c++ - map 的 map 与 std::pair 作为键的优势是什么