我在我的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)
不幸的是,这和前两个版本一样慢。发电机的表达和功能更差。那么有更优雅,更快的东西吗?
答案 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)
已经遍历从0
到cycles - 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()