您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 为什么三元运算符比.ts更快?

5b51 2022/1/14 8:21:35 python 字数 3164 阅读 507 来源 www.jb51.cc/python

我最近发现了令人惊讶的事情.给定一个不包含密钥k的dict d,使用三元运算符尝试检索具有默认返回的项目:>>> def tern(): ... d[k] if k in d else 'foo' ... >>> timeit.timeit(tern, number=1000000) 0.1234209537506

概述

我最近发现了令人惊讶的事情.给定一个不包含密钥k的dict d,使用三元运算符尝试检索具有认返回的项目:

>>> def tern():
...     d[k] if k in d else 'foo'
...
>>> timeit.timeit(tern,number=1000000)
0.12342095375061035

运行速度比dict的.get()函数快:

>>> def get_meth():
...     d.get(k,'foo')
...
>>> timeit.timeit(get_meth,number=1000000)
0.20549297332763672

这对我来说似乎是违反直觉的.我认为三元运算符需要通过dict进行2次搜索(一次在d中测试k),然后另一次搜索d [k],而.get只是尝试检索d [k],如果失败,返回’foo’.

我在一个大字典(一百万个元素)和一个小字母(100)上运行它,两次都是三元组明显更快.幕后发生了什么事?

如果在

  3           0 LOAD_CONST               1 ('blub')
              3 LOAD_GLOBAL              0 (d)
              6 COMPARE_OP               6 (in)
              9 POP_JUMP_IF_FALSE       22
             12 LOAD_GLOBAL              0 (d)
             15 LOAD_CONST               1 ('blub')
             18 BINARY_SUBSCR       
             19 JUMP_FORWARD             3 (to 25)
        >>   22 LOAD_CONST               2 ('foo')
        >>   25 POP_TOP             
             26 LOAD_CONST               0 (None)
             29 RETURN_VALUE        

获取方法

  6           0 LOAD_GLOBAL              0 (d)
              3 LOAD_ATTR                1 (get)
              6 LOAD_CONST               1 ('blub')
              9 LOAD_CONST               2 ('foo')
             12 CALL_FUNCTION            2          #Expensive call
             15 POP_TOP             
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        

我刚才读过一篇很长的文章,其中有一节描述了为什么CALL_FUNCTION如此昂贵:
https://doughellmann.com/blog/2012/11/12/the-performance-impact-of-using-dict-instead-of-in-cpython-2-7-2/

总结

以上是编程之家为你收集整理的python – 为什么三元运算符比.ts更快?全部内容,希望文章能够帮你解决python – 为什么三元运算符比.ts更快?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶