【发布时间】:2013-11-16 19:04:04
【问题描述】:
我在我的 python 脚本中使用了很多随机数。传统上,我只是在需要它们的地方调用 random.random(),但现在这占了执行时间的很大一部分。所以我想提高速度。
原始版本可以归结为:
from random import random
for _ in range(cycles):
_ = random()
请注意,有一个固定的(当然更复杂的)迭代正在进行。
现在我尝试使用numpy:
from numpy.random import random
for _ in range(cycles):
_ = random()
一方面这比内置 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)
不幸的是,这与前两个版本一样慢。生成器表达式和函数更糟糕。那么有没有更优雅、更快速的东西呢?
【问题讨论】:
-
最佳加速(最高 1000 倍)将来自用 numpy 矢量化操作替换迭代。如果你能做到,那就去做。如果您发布更多关于您使用这些数字做什么的详细信息,我们或许可以帮助您做到这一点。
-
在此期间,您是否尝试过 enumerating 数组?
-
@user2357112:感谢您的建议。进行矢量化操作确实是一个有趣的想法。但这需要对算法进行重大重建。我一定会考虑的。
-
@user2357112:使用枚举又慢了。这么简单的事情怎么会增加这么多(相对的)开销,真是令人沮丧……
-
你在循环体中做了多少工作?贴出代码;几乎可以肯定它很短。我们现在或许可以对其进行矢量化处理。
标签: python performance random python-3.x iterator