为什么`if`在语句前检查比在语句后检查这么快?

马库斯·梅斯卡宁(Markus Meskanen)

这是我的意思的示例:

s = """
if x > 10:
    x -= 10
else:
    x = 0
"""
import timeit
print(timeit.timeit(s, setup="x=5", number=99999999))

不管设置如何,在我的计算机上输出大约3秒(x=5vs x=15,无差异)


如果我要使用短得多的代码,则首先减少代码,x -= 10然后再检查,如果x < 0得到的结果会更差:

s = """
x -= 10
if x < 0:
    x = 0
"""
import timeit
print(timeit.timeit(s, setup="x=5", number=99999999))

它将再次输出约6秒,而不管xwas的初始值5还是15


我知道这会比较慢,x < 10因为我们先调用x -= 10然后设置,x = 0而不是简单地设置x一次。

事实是,x在我的程序中,有99%的时间将初始值设置为远远大于10的数字,所以我认为我会使用较短的版本,因为在大多数情况下,我认为性能不会有所不同。

但是,即使在情况下x > 10性能也存在巨大差异,这是为什么呢?

奥尔普

你的前提是错的。setup整个系统只运行一次timeit如果您确保其值x保持不变,10则症状会消失:

>>> s1 = """
... if x > 10:
...     x -= 10
... else:
...     x = 0
... """
>>> s2 = """
... x -= 10
... if x < 0:
...     x = 0
... """
>>> import timeit
>>> print(timeit.timeit(s1, setup="x=1000000000", number=99999999))
8.934118068675566
>>> print(timeit.timeit(s2, setup="x=1000000000", number=99999999))
8.744505329313448

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么or语句比in语句快?

来自分类Dev

为什么Ext4磁盘检查比NTFS这么快?

来自分类Dev

为什么这个 select 语句这么慢?

来自分类Dev

为什么在检查特定分支是否已提交时,提交后钩子条件语句为什么不起作用?

来自分类Dev

为什么c在编译时不检查return语句

来自分类常见问题

为什么带有赋值和相等性检查的if语句为什么评估为false?

来自分类Dev

为什么我的空值检查这么慢?

来自分类Dev

为什么检查 Console.OutputEncoding 需要这么长时间?

来自分类Dev

为什么std :: rotate这么快?

来自分类Dev

Python集排序,为什么这么快?

来自分类Dev

为什么jQuery的$ .each这么快?

来自分类Dev

与SQLite相比,为什么Realm这么快?

来自分类Dev

为什么heapq.heapify这么快?

来自分类Dev

为什么Regex的Matches功能这么快?

来自分类Dev

为什么Numpy的克朗这么快?

来自分类Dev

为什么C#OrderBy这么快?

来自分类Dev

为什么`updatedb`程序运行这么快?

来自分类Dev

为什么SSD比原始NAND这么快?

来自分类Dev

为什么流浪汉这么快?

来自分类Dev

为什么每行计算都比检查是否已完成快?

来自分类Dev

始终检查语句更新

来自分类Dev

函数检查“ if”语句的问题

来自分类Dev

使用if语句检查IsDBNull

来自分类Dev

优化if语句以检查值

来自分类Dev

CASE语句值检查

来自分类Dev

检查for语句中的条件

来自分类Dev

jQuery if语句语法检查

来自分类Dev

空检查的条件语句

来自分类Dev

使用IF语句检查值