什么更快,a==2==b 还是 a==2 并且 b==2?

4

4
请花点时间阅读这篇文章 - Cory Kramer
@CoryKramer 这是一个自问自答的问题吗?这也有点儿是个“理论性”的问题。 - noɥʇʎԀʎzɐɹƆ
1
我能看到,我只是一般性地发表了那个评论。像这样的问题通常没有用处,因为它们深入探讨了不必要的微观优化(这在代码中很少是瓶颈) 。只需编写易读且正确的代码,并在性能成为问题且此代码片段引起问题时才担心优化。 - Cory Kramer
5
这个问题在 Programmers 上将会被关闭。我们预计你已经对你的应用程序进行了性能测试来衡量它是否真的很重要。 - Thomas Owens
2
@JamesLu 不,这个问题适合在Stack Overflow上讨论;不应该迁移到Programmers。 - durron597
显示剩余3条评论
2个回答

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.1秒。在我的电脑上,平均时间如下:

  • A:0.22025904178619385秒
  • B:0.3740460252761841秒

您可以自己试试。

随机字符串生成感谢这篇Stack Overflow问题


1
如果你使用 dis 查看字节码,这就有些不足为奇了——表达式 A 有 12 个操作,而表达式 B 只有 8 个。 - jonrsharpe
1
你能详细说明一下"I'm using len() to gauge the execution time better"吗?比什么更好? - jonrsharpe
@jonrsharpe 已完成,但我不知道它有多清晰。 - noɥʇʎԀʎzɐɹƆ
1
所以你只是这样做来避免硬编码 2==2==2 吗?看起来这需要跳过很多环节,特别是随机字符串,当你只想要 len(x) == 2 的东西。最好在一系列输入上测试这些 - 这四种情况之间有性能差异吗(a == 2 and b == 2a == 2 and b != 2a != 2 and b == 2a != 2 and b != 2)? - jonrsharpe
@jonrsharpe,我认为在阅读了那篇文章之后,这个应该被迁移。 - noɥʇʎԀʎzɐɹƆ

3
根据字节码的分析:
>>> 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 == 2a==2==b 需要更多的操作才能被 Python 处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接