这是使用列表(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)初始化一千万个随机数数组的示例。结果是完全相同的,列表或元组从不使用,所以...
(randint(1, 100) for _ in range(0, 1000000))
不是元组,而是生成器:[randint(1, 100) for _ in range(0, 10000000)]