簡體   English   中英

為什么內聯if / else比Python中的.get()快?

[英]Why is an inline if/else faster than a .get() in Python?

我早些時候在回顧一些代碼,開發人員編寫了一個內聯if / else而不是get()來從列表中檢索元素(如果存在)(否則為其提供默認值)。 我決定在repl上添加一些timeit代碼,並對結果感到困惑。 if / else需要get()時間的1/3。

這是repl代碼 ,下面是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

10次​​迭代的視覺效果

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 test提供一個可以使用的局部變量),則該字段將被平整:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM