提问人:Hatsune Miku 提问时间:8/24/2023 更新时间:8/24/2023 访问量:68
是比较还是 if 语句更快 [已关闭]
Is a comparison or if statement faster [closed]
问:
执行以下操作会比仅执行 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 将其运算符转换为方法调用。它不知道他们中的任何一个实际上在做什么。确切的规则可能会变得复杂,但或多或少会变成mult = x or y
mult = x.__bool__() or y.__bool__()
x
并决定对他们意味着什么并相应地返回或相应地返回。对于整数,是 ,其他一切都是 。 短路,所以如果 ,则不进行方法调用。y
bool
True
False
0
False
True
or
x
True
y
mult = (x/x) or (y/y)
变成类似的东西
mult = x.__div__(x).__bool__() or y.__div__(y).__bool__()
x/x
几乎会消失(至少对于整数而言),但 Python 不知道这一点。它需要进行额外的调用。这使得它变慢。将其写成 ,甚至更好,会更快。例外情况是,当一个值是 .1
div
mult = 1 or 1
mult = 1
0
ZeroDivisionError
draw(x, y, 0, 255, 0, 255*mult)
与draw(x_pos, y_pos, red, green, blue, alpha)
第一种使用文字,这比查找和读取变量等要快一些......但它有乘法的成本。1 会稍微快一点。red
恕我直言,这些不同的做事方式都不会对代码的执行产生真正的影响。这都是一点白噪音。
评论
(63+78+68)/3 = 70
(90+100+97)/3 = 96
96/70
if
mult = x if x else y
x
if x/x == 1 or y/y == 1:
if x or y:
if x or y:
在运行一些基准测试(并解决一些错误)之后。看起来好像 if 语句比比较无分支的源方法更快。如果有人有兴趣并想检查任何错误或错误,这里是 GitHub。
https://github.com/Weebed-Coder/comparative_bench
我很快就把代码扔到了一起,所以可能会有一些错误。但是,据我所知,if 语句运行得更快一些。鼓励人们也在 C/Rust/Assembly 中对此进行测试,以确保它尽可能少地与 Python 相关的问题。
评论
draw()
x/x
1