什么更快,a==2==b
或a==2
和b==2
?
要明确的是,表达式1会对这两个项目进行一次评估,而不会将a
与b
进行比较。
答案 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的速度大约是十分之一秒。在我的电脑上,平均时间如下:
亲自试试。
感谢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