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

时间:2015-06-12 15:59:01

标签: python performance optimization

什么更快,a==2==ba==2b==2

要明确的是,表达式1会对这两个项目进行一次评估,而不会将ab进行比较。

这值得一读:In Python, is an "and" statement or all() faster?

2 个答案:

答案 0 :(得分:5)

使用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的速度大约是十分之一秒。在我的电脑上,平均时间如下:

  • A:0.22025904178619385秒
  • B:0.3740460252761841秒

亲自试试。

感谢this Stack Overflow question生成随机字符串。

答案 1 :(得分:4)

根据字节码分析:

>>> 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 and b == 2