使用 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.1秒。在我的电脑上,平均时间如下:
您可以自己试试。
随机字符串生成感谢这篇Stack Overflow问题。
dis
查看字节码,这就有些不足为奇了——表达式 A 有 12 个操作,而表达式 B 只有 8 个。 - jonrsharpelen()
to gauge the execution time better"吗?比什么更好? - jonrsharpe2==2==2
吗?看起来这需要跳过很多环节,特别是随机字符串,当你只想要 len(x) == 2
的东西。最好在一系列输入上测试这些 - 这四种情况之间有性能差异吗(a == 2 and b == 2
、a == 2 and b != 2
、a != 2 and b == 2
、a != 2 and b != 2
)? - jonrsharpe>>> 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
相较于 a == 2 and b == 2
,a==2==b
需要更多的操作才能被 Python 处理。