[英]Is there a fast iterator over random numbers in python?
我在我的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)
不幸的是,这和前两个版本一样慢。 生成器的表达和功能甚至更糟。 那么,还有什么更优雅,更快速的东西吗?
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]
使用内置方法迭代numpy数组而不是nditer()怎么样?
from numpy.random import random
rnd = iter(random(cycles))
for _ in range(cycles):
_ = rnd.next()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.