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

问题描述 投票:1回答:1

这是使用列表(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实现在列表周围比在元组上具有更多的优化。我可以期望这是一致的吗?更笼统地说,我应该使用其中一个,为什么? (或者我应该完全通过其他方式进行这种初始化。)

Update

:答案和评论使我意识到b示例实际上不是元组,而是generator,因此我在标题和上面的文本中做了一些编辑以反映这一点。我也尝试将列表版本分成这样的两行,这将强制将列表实例化:g = [randint(1, 100) for _ in range(0, 10000000)] a = array('H', g)
似乎没有什么区别。列表版本大约需要8.5秒,而生成器版本大约需要9秒。

这是使用列表(a)和类似元组的生成器(b)初始化一千万个随机数数组的示例。结果是完全相同的,列表或元组从不使用,所以...

python
1个回答
2
投票
虽然看起来像,但(randint(1, 100) for _ in range(0, 1000000))不是元组,而是生成器:

0
投票
[randint(1, 100) for _ in range(0, 10000000)]
© www.soinside.com 2019 - 2024. All rights reserved.