gpt4 book ai didi

python - 为什么内联 if/else 比 Python 中的 .get() 更快?

转载 作者:太空狗 更新时间:2023-10-29 17:10:57 30 4
gpt4 key购买 nike

我之前正在审查一些代码,开发人员编写了内联 if/else 而不是 get() 来从中检索元素一个列表,如果它存在(否则给它一个默认值)。我决定在 repl 上启动一些 timeit 代码,结果让我很困惑。 if/else 花费的时间是 get() 的 1/3。

Here is the repl code ,下面是 repl 中的代码以及后代的结果:

import timeit

D = {"a": 1, "b": 2, "c": 3}

def ef(): return D['a'] if 'a' in D else 1

def gt(): return D.get('a', 1)

print "gt1", timeit.timeit(gt, number=10000)
print "ef1", timeit.timeit(ef, number=10000)
print "ef2", timeit.timeit(ef, number=10000)
print "gt2", timeit.timeit(gt, number=10000)

结果:

gt1 0.0659999847412
ef1 0.0239999294281
ef2 0.0249998569489
gt2 0.0539999008179

以及上述 timeit 调用的 10 次迭代的视觉效果,其中出于表示目的,结果已乘以 10000

visual of 10 iterations

最佳答案

D.get() 路径包括一个属性查找和一个方法调用:

>>> import dis
>>> D = {"a": 1, "b": 2, "c": 3}
>>> def gt(): return D.get('a', 1)
...
>>> dis.dis(gt)
1 0 LOAD_GLOBAL 0 (D)
3 LOAD_ATTR 1 (get)
6 LOAD_CONST 1 ('a')
9 LOAD_CONST 2 (1)
12 CALL_FUNCTION 2
15 RETURN_VALUE

属性查找 (LOAD_ATTR) 尤其会减慢速度。

如果您删除属性查找(并为 in 测试提供本地工作),则该字段会被拉平:

>>> def gt_fast(D_get=D.get): return D_get('a', 1)
...
>>> def ef_fast(D=D): return D['a'] if 'a' in D else 1
...
>>> timeit.timeit(gt_fast)
0.2174091339111328
>>> timeit.timeit(ef_fast)
0.2139298915863037

关于python - 为什么内联 if/else 比 Python 中的 .get() 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28509261/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com