gpt4 book ai didi

Python 生成器与列表作为数组初始值设定项

转载 作者:行者123 更新时间:2023-11-30 21:51:19 25 4
gpt4 key购买 nike

下面是一个使用列表 (a) 和元组生成器 (b) 初始化一千万随机数数组的示例。结果完全相同,列表或元组从未使用过,因此其中之一没有实际优势

from random import randint
from array import array

a = array('H', [randint(1, 100) for _ in range(0, 10000000)])
b = array('H', (randint(1, 100) for _ in range(0, 10000000)))

所以问题是使用哪一个。原则上,我的理解是,元组应该能够使用比列表更少的资源,但由于不保留此列表和元组,因此应该有可能在不初始化中间数据结构的情况下执行代码…我的测试表明,在这种情况下,列表稍微更快。我只能想象这是因为 Python 实现对列表的优化比对元组的优化更多。我可以期望这是一致的吗?

更一般地说,我应该使用其中之一,为什么? (或者我应该完全以其他方式进行这种初始化。)

更新:答案和评论让我意识到b示例实际上并不是一个元组,而是一个生成器,所以我编辑了一些在标题和上面的文字中反射(reflect)这一点。我还尝试将列表版本分成两行,如下所示,这应该强制列表实际被实例化:

g = [randint(1, 100) for _ in range(0, 10000000)]
a = array('H', g)

看起来没有什么区别。列表版本耗时约8.5秒,生成器版本耗时约9秒。

最佳答案

虽然看起来像这样,但 (randint(1, 100) for _ in range(0, 1000000)) 不是一个元组,而是一个生成器:

>>> type((randint(1, 100) for _ in range(0, 1000000)))
<class 'generator'>
>>>

如果您确实想要一个元组,请使用:

b = array('H', tuple(randint(1, 100) for _ in range(0, 1000000)))

列表比生成器快一点是有道理的,因为生成器会在被询问时生成下一个值,一次一个,而列表理解会分配所需的所有内存,然后继续用所有值填充它去。速度优化是通过内存空间来实现的。

我更喜欢生成器,因为无论最合理的内存限制如何,它都会工作,并且适用于任意数量的随机数,而列表的加速是最小的。除非您需要一次又一次地生成此列表,此时加速就会开始计算 - 但您可能每次都会使用相同的列表副本。

关于Python 生成器与列表作为数组初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60136564/

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