【问题标题】:What's faster, a==2==b, or a==2 and b==2哪个更快,a==2==b,或者 a==2 和 b==2
【发布时间】:2015-06-12 15:59:01
【问题描述】:

哪个更快,a==2==b,或a==2b==2

需要明确的是,表达式 1 对这两个项目都求值一次,并且不会将 ab 进行比较。

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

【问题讨论】:

  • 请抓紧时间read this
  • @CoryKramer 这是一个自我回答的问题...?这也是一种“理论”问题。
  • 我可以看到,我只是一般地发布该评论。像这样的问题通常毫无用处,因为它们深入研究了不必要的微优化which are rarely the bottleneck in code。只需编写代码以确保可读性和正确性,并担心优化如果性能是一个问题并且如果这段代码是导致问题的原因。
  • @JamesLu 这将对程序员关闭。如果真的很重要,我们希望您已经对要衡量的应用程序进行了概要分析。
  • @JamesLu 不,这个问题是 Stack Overflow 的主题;它不应该被迁移到程序员。

标签: python performance optimization


【解决方案1】:

使用 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 秒

自己试试吧。

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

【讨论】:

  • 如果您使用 dis 查看字节码,这有点不足为奇 - 表达式 A 是 12 个操作,而表达式 B 是 8 个
  • 您能否进一步说明“我正在使用len() 来更好地衡量执行时间” - 比什么更好?
  • @jonrsharpe 完成了,虽然我不知道它有多清晰。
  • 所以你这样做是为了避免硬编码2==2==2?似乎要跳过很多圈,尤其是当您想要的只是len(x) == 2 时的随机字符串。最好在一系列输入上测试这些 - 至少四种情况(a == 2 and b == 2a == 2 and b != 2a != 2 and b == 2a != 2 and b != 2)之间的性能有什么差异吗?
  • @jonrsharpe 我真的认为这应该在阅读后迁移。
【解决方案2】:

根据字节码的分析:

>>> 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 需要更多的操作

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多