gpt4 book ai didi

python - 为什么 _ in range(n) 比 _ in [""]*n 慢?

转载 作者:太空狗 更新时间:2023-10-29 22:03:33 30 4
gpt4 key购买 nike

测试 for _ in range(n) 的替代方案(执行某些操作 n 次,即使该操作不依赖于 n 的值) 我注意到此模式还有另一种更快的表述方式,for _ in [""] * n

例如:

timeit('for _ in range(10^1000): pass', number=1000000)

返回 16.4 秒;

然而,

timeit('for _ in [""]*(10^1000): pass', number=1000000)

需要 10.7 秒。

为什么 [""] * 10^1000 比 Python 3 中的 range(10^1000) 快得多?

所有测试均使用 Python 3.3 完成

最佳答案

当遍历 range() 时,生成 0 到 n 之间所有整数的对象;这需要(少量)时间,即使是 small integers having been cached .

另一方面,[None] * n 上的循环会生成对 1 个对象的 n 引用,并且创建该列表的速度要快一些。

但是,range() 对象使用的内存少,并且启动时更具可读性,这就是人们更喜欢使用它的原因.大多数代码不必在性能上竭尽全力。

如果您需要这样的速度,您可以使用不占用内存的自定义迭代器,使用 itertools.repeat()带有第二个参数:

from itertools import repeat

for _ in repeat(None, n):

至于你的计时测试,那些有一些问题。

首先,你在你的['']*n定时循环中犯了一个错误;你没有嵌入两个引号,你连接了两个字符串并生成了一个空列表:

>>> '['']*n'
'[]*n'
>>> []*100
[]

这在迭代中将是无与伦比的,因为您迭代了 0 次。

您也没有使用大数字; ^ 是二元异或运算符,不是幂运算符:

>>> 10^1000
994

这意味着您的测试错过了创建一个空值列表所需的时间。

使用更好的数字和 None 可以得到:

>>> from timeit import timeit
>>> 10 ** 6
1000000
>>> timeit("for _ in range(10 ** 6): pass", number=100)
3.0651066239806823
>>> timeit("for _ in [None] * (10 ** 6): pass", number=100)
1.9346517859958112
>>> timeit("for _ in repeat(None, 10 ** 6): pass", 'from itertools import repeat', number=100)
1.4315521717071533

关于python - 为什么 _ in range(n) 比 _ in [""]*n 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30399987/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com