python中的随机数是否有快速迭代器?

时间:2013-11-16 19:04:04

标签: python performance random python-3.x iterator

我在我的python脚本中使用了很多随机数。传统上我只是调用了random.random(),我需要它们,但现在它占了执行时间的很大一部分。所以我想提高速度。

原始版本可归结为:

from random import random
for _ in range(cycles):
    _ = random()

请注意,有一个固定的(当然是更复杂的)迭代。

现在我尝试使用numpy

from numpy.random import random
for _ in range(cycles):
    _ = random()

一方面,这甚至比内置随机慢,但另一方面,numpy.random.random支持生成大量随机数:

from numpy.random import random
rnd = random(cycles)
i = 0
for _ in range(cycles):
    _ = rnd[i]
    i += 1

大!这只是原始运行时间的第五

我遇到的问题是,维护单独的索引i并不是很好,所以我宁愿写这样的东西:

from numpy.random import random
from numpy import nditer
iter_rnd = nditer(random(cycles))
for _ in range(cycles):
    _ = next(iter_rnd)

不幸的是,这和前两个版本一样慢。发电机的表达和功能更差。那么有更优雅,更快的东西吗?

2 个答案:

答案 0 :(得分:0)

for i, random_number in enumerate(rnd):
    do_whatever(i, random_number)
当你想迭代一个序列及其索引时,

enumerate是常用的工具。但是,如果你正在使用numpy,那么尽可能避免迭代通常会更好。使用numpy矢量化操作替换迭代可以使您的代码更短,更清晰,并且速度提高1000倍。

虽然我们正在使用它,但我想指出在使用for循环时我注意到的一些奇怪的事情。

from numpy.random import random
rnd = random(cycles)
i = 0
for _ in range(cycles):
    _ = rnd[i]
    i += 1

您似乎使用for循环作为重复一段代码的方式一定次数,完全忽略迭代变量。 for _ in range(cycles)已经遍历从0cycles - 1的整数;您不需要手动增加单独的i变量。此代码可以简化为以下内容:

from numpy.random import random
rnd = random(cycles)
for i in range(cycles):
    random_number = rnd[i]

答案 1 :(得分:0)

如何使用内置方法迭代numpy数组,而不是nditer()?

from numpy.random import random
rnd = iter(random(cycles))
for _ in range(cycles):
    _ = rnd.next()