python - 有没有更快的方法从字典中获取多个键?

标签 python performance dictionary key-value

我有一本字典:

d = {'a':1, 'b':2, 'c':3, 'd':4}

然后我有一个键列表:

l = ['a', 'b', 'z']

我想要的结果是:

[1, 2, None]

到目前为止我正在做的是:

[d.get(k) for k in l]

有没有更快的方法?也许没有 for

最佳答案

你可以使用:

>>> list(map(d.get, l))
[1, 2, None]

它有两个优点:

  • 它只执行一次d.get查找——不是每次迭代
  • Only CPython: 因为dict.get是用C实现的,map是用C实现的,所以可以在函数调用中避开Python层(大致来说细节是有点复杂)。

至于计时(在 Jupyter notebook 中的 Python 3.6 上执行):

d = {'a':1, 'b':2, 'c':3, 'd':4}
l = ['a', 'b', 'z']

%timeit list(map(d.get, l))
594 ns ± 41.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit [d.get(k) for k in l]
508 ns ± 17.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

请注意,在这种情况下,这实际上更慢!这是因为对于简短的迭代器,maplist 开销占主导地位。因此,如果您希望它在短迭代上更快,请坚持使用您的方法。

l 越长,list(map(...)) 最终变得更快:

d = {'a':1, 'b':2, 'c':3, 'd':4}
l = [random.choice(string.ascii_lowercase) for _ in range(10000)]

%timeit list(map(d.get, l))
663 µs ± 64.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit [d.get(k) for k in l]
1.13 ms ± 7.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

然而,这仍然“只是”快了 2 倍。

关于python - 有没有更快的方法从字典中获取多个键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49555779/

相关文章:

python - 如何使用 python 在多个打开的 powerpoint 演示文稿之间切换?

python - 不能在 Django 中 pickle 字典

python - 如何根据部分字符串匹配来过滤字典?

ios - 如何使用 SearchBar TableView 在字典中搜索对象?

python - 以编程方式关闭 Paramiko 中的 SSH 隧道

java - 我的 Python-Java 接口(interface),好的设计?以及如何包装 JNI 函数?

sql-server - 发布 Oracle 和 SQL Server 性能测试是否违反许可?

c# - 如何优化DataGridView的性能

performance - 在 Web 应用程序的压力测试期间记录性能时,我应该在 Windows 性能监视器中使用哪些计数器?

具有默认值的 Python 嵌套字典查找