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我真的认为读过这篇文章后应该迁移它。