Python 什么';s更快,a==2==b,或a==2和b==2

Python 什么';s更快,a==2==b,或a==2和b==2,python,performance,optimization,Python,Performance,Optimization,什么更快,a==2==b,或者a==2和b==2 为了清楚起见,表达式一对这两个项都进行一次计算,并且不会将a与b进行比较 这值得一读:使用timeit对两种方法进行计时 我使用len()来更好地衡量执行时间,作为延迟立即评估的一种方法 以下两个的设置字符串: setup = """import random import string a = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range

什么更快,
a==2==b
,或者
a==2
b==2

为了清楚起见,表达式一对这两个项都进行一次计算,并且不会将
a
b
进行比较


这值得一读:

使用
timeit对两种方法进行计时

我使用
len()
来更好地衡量执行时间,作为延迟立即评估的一种方法

以下两个的设置字符串:

setup = """import random
import string
a = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(2))
b = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(2))"""
最终测试表达式A:

timeit.repeat("len(a)==2==len(b)", setup=setup, repeat=100)
最终测试表达式B:

timeit.repeat("len(a)==2 and len(b)==2", setup=setup, repeat=100)
两个测试都运行表达式一百万次,记录时间,然后执行一百次

结果表明,表达式B的速度快了约十分之一秒。在我的电脑上,平均时间如下:

  • 答:0.22025904178619385秒
  • B:0.3740460252761841秒
你自己试试看


随机字符串生成得益于。

根据字节码分析:

>>> dis.dis(compile('a==2==b', '', 'eval'))
  1           0 LOAD_NAME                0 (a)
              3 LOAD_CONST               0 (2)
              6 DUP_TOP
              7 ROT_THREE
              8 COMPARE_OP               2 (==)
             11 JUMP_IF_FALSE_OR_POP    21
             14 LOAD_NAME                1 (b)
             17 COMPARE_OP               2 (==)
             20 RETURN_VALUE
        >>   21 ROT_TWO
             22 POP_TOP
             23 RETURN_VALUE
>>> dis.dis(compile('a==2 and b==2', '', 'eval'))
  1           0 LOAD_NAME                0 (a)
              3 LOAD_CONST               0 (2)
              6 COMPARE_OP               2 (==)
              9 JUMP_IF_FALSE_OR_POP    21
             12 LOAD_NAME                1 (b)
             15 LOAD_CONST               0 (2)
             18 COMPARE_OP               2 (==)
        >>   21 RETURN_VALUE

Python需要更多的操作来处理
a==2==b
而不是
a==2和b==2

请花点时间来@CoryKramer这是一个自我回答的问题。。。?这也是一个“理论性”的问题。我可以看出,我只是一般性地发表评论。像这样的问题通常毫无用处,因为它们深入研究了不必要的微观优化。只需为可读性和正确性编写代码,并担心优化iff性能是一个问题,而iff这段代码正是问题的根源。@JamesLu这将对程序员关闭。我们希望您已经对应用程序进行了评测,如果它真的很重要的话。@JamesLu否,这个问题是关于堆栈溢出的;它不应该被移植到程序员身上。如果你用
dis
查看字节码,这并不奇怪-表达式A是12个运算,而表达式B是8个运算。你能扩展一下“我用
len()
更好地衡量执行时间吗”-比什么更好?@jornsharpe Done,虽然我不知道它有多清晰。所以你这么做只是为了避免硬编码
2==2==2
?它似乎有很多需要跳过的环,特别是当你想要的只是一些
len(x)==2时的随机字符串。最好是在一系列输入上测试它们-这四种情况(
a==2和b==2
a==2和b!=2
a!=2和b==2
a!=2和b!=2
)之间的性能是否有任何差异,至少?@jornsharpe我真的认为读过这篇文章后应该迁移它。