繁体   English   中英

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

[英]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)已经在从0cycles - 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM