是比较还是 if 语句更快 [已关闭]

Is a comparison or if statement faster [closed]

提问人:Hatsune Miku 提问时间:8/24/2023 更新时间:8/24/2023 访问量:68

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

3个月前关闭。

执行以下操作会比仅执行 if 语句更快还是更慢?

mult = x or y 
# Assuming python considers something 
# being "0" as false and something being 1 or higher 
# (or -1 and lower) as true

mult = (x/x) or (y/y) 
# This is in the case Python doesn't do what was
# described above

draw(x, y, 0, 255, 0, 255*mult)
# draw(x_pos, y_pos, red, green, blue, alpha)

不知道如何更好地措辞,更不用说是否有必要更好地措辞了。当我谈论优化代码以提高性能时,我只是好奇的事情,我产生了这样的想法,但不确定,因为 Google 没有提供任何有用的结果(所有这些都不相关)。

我可能也可以在我自己的时间里测试一下,但我觉得好像在问一个知道计算机如何与比较与陈述是否最有帮助的人。

Python 性能 if 语句 优化 比较

评论

2赞 J_H 8/24/2023
向我们展示您到目前为止获得的基准测试结果。
0赞 Hatsune Miku 8/24/2023
我还没有运行基准测试,因为我不确定哪些操作等同于运行,但是我将继续快速设置一个,看看我得到了什么。draw()
1赞 Jab 8/24/2023
您所指的“if 语句”是什么?
1赞 tdelaney 8/24/2023
你能发布 if 语句进行比较吗?我不明白 1 和 2 有什么关系。 是 1(假设是整数),所以它只是一种昂贵的写作方式。x/x1
1赞 tdelaney 8/24/2023
@HatsuneMiku - 0 将是零除法异常 - 速度较慢!

答:

0赞 tdelaney 8/24/2023 #1

Python 将其运算符转换为方法调用。它不知道他们中的任何一个实际上在做什么。确切的规则可能会变得复杂,但或多或少会变成mult = x or y

mult = x.__bool__() or y.__bool__()

x并决定对他们意味着什么并相应地返回或相应地返回。对于整数,是 ,其他一切都是 。 短路,所以如果 ,则不进行方法调用。yboolTrueFalse0FalseTrueorxTruey

mult = (x/x) or (y/y)变成类似的东西

mult = x.__div__(x).__bool__() or y.__div__(y).__bool__()

x/x几乎会消失(至少对于整数而言),但 Python 不知道这一点。它需要进行额外的调用。这使得它变慢。将其写成 ,甚至更好,会更快。例外情况是,当一个值是 .1divmult = 1 or 1mult = 10ZeroDivisionError

draw(x, y, 0, 255, 0, 255*mult)draw(x_pos, y_pos, red, green, blue, alpha)

第一种使用文字,这比查找和读取变量等要快一些......但它有乘法的成本。1 会稍微快一点。red

恕我直言,这些不同的做事方式都不会对代码的执行产生真正的影响。这都是一点白噪音。

评论

0赞 Hatsune Miku 8/24/2023
我明白了,谢谢你的回答。决定在 Python 中做一个快速基准测试,看起来好像使用比较的速度大约是平均语句的 137%。假设我至少正确地计算了数学。 对于比较工作台,然后是 if 语句工作台。然后我做到了,所以如果你想复习它,有我的数学,如果有任何错误,可以纠正它。这些结果出现在使用 1_000_000 次执行时,所有数字都以毫秒为单位(当然,百分比除外)。(63+78+68)/3 = 70(90+100+97)/3 = 9696/70
0赞 tdelaney 8/24/2023
我不确定你的陈述是什么样子的,但也许.它涉及额外的查找,所以有点慢。函数中的查找速度比模块级别更快,因为函数局部变量得到了优化。我认为当前的 python 优化工作将缩小其中的一些差距。这都是一个微不足道的区别 - 但我不得不承认在我的代码中使用了非 if 语义,可读性该死。ifmult = x if x else yx
0赞 Hatsune Miku 8/24/2023
我的 if 语句看起来像,我刚才意识到不应该,并将其更改为,现在它似乎是相同的速度。现在没有注意到这个严重错误,直到我去检查我应该更改它的 if 语句,但忘记这样做了。x) 然而,从当前的测试来看,if 语句实际上似乎更快。我不确定这是 Python 问题,还是机器级别的问题。if x/x == 1 or y/y == 1:if x or y:if x or y:
-2赞 Hatsune Miku 8/24/2023 #2

在运行一些基准测试(并解决一些错误)之后。看起来好像 if 语句比比较无分支的源方法更快。如果有人有兴趣并想检查任何错误或错误,这里是 GitHub。

https://github.com/Weebed-Coder/comparative_bench

我很快就把代码扔到了一起,所以可能会有一些错误。但是,据我所知,if 语句运行得更快一些。鼓励人们也在 C/Rust/Assembly 中对此进行测试,以确保它尽可能少地与 Python 相关的问题。