python - 优化使用python 3生成大量随机数

标签 python python-3.x optimization random numbers

我想在一个范围内(0 到 pi/8)生成八个随机数,将它们加在一起,取这个和的正弦,然后在这样做 N 次后,取平均结果。放大后我得到了正确的答案,但是对于 N > 10^6 来说太慢了,尤其是当我对 N 次试验 n_t = 25 进行平均时!我目前正在让这段代码在 12 秒 内运行 N = 10^5,这意味着 20 分钟 N = 10^7,这似乎不是最优的(可能是,我不知道!)。

我的代码如下:

import random
import datetime
from numpy import pi
from numpy import sin
import numpy
t1 = datetime.datetime.now()

def trial(N):
    total = []
    uniform = numpy.random.uniform
    append = total.append
    for j in range(N):
        sum = 0
        for i in range (8):
            sum+= uniform(0, pi/8)
        append(sin(sum))
    return total

N = 1000000
n_t = 25
total_squared = 0
ans = []
for k in range (n_t):
    total = trial(N)
    f_mean = (numpy.sum(total))/N
    ans.append(f_mean*((pi/8)**8)*1000000)
sum_square = 0
for e in ans:
    sum_square += e**2
sum = numpy.sum(ans)
mean = sum/n_t
variance = sum_square/n_t - mean**2
s_d = variance**0.5
print (mean, " ± ", s_d)
t2 = datetime.datetime.now()
print ("Execution time: %s" % (t2-t1))

如果有人能帮我优化这个,我将不胜感激!

谢谢你:)

最佳答案

鉴于您要求使用此方法获得结果,np.sin(np.random.uniform(0,np.pi/8,size=(8,10**6,25)).sum (axis=0)).mean(axis=0) 可以让你很快完成 25 次试验……这是完全矢量化的(简洁明了,这总是一个奖励!)所以我怀疑你能做得更好。 ..

解释:

您生成了一个大小为 (8 x 10**6 x 25) 的大型随机 3d 数组。 .sum(axis=0) 将为您提供第一个维度 (8) 的总和。 np.sin(...) 按元素应用。 .mean(axis=0) 将为您提供第一个剩余维度 (10**6) 的平均值,并为您提供长度为 ( 25) 对应于您的试验。

关于python - 优化使用python 3生成大量随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38696070/

相关文章:

python - NetworkX - 如何从 Shapefile 创建 MultiDiGraph?

python - 行是 3 个最新值的总和

Django Rest API Url Pattern 来处理 . (点)符号

html - 基于 HTML 结构的 CSS 优化器

python - 如何在 Python 中处理 AssertionError 并找出它发生在哪一行或哪条语句上?

python - 为什么删除临时文件时出现 WindowsError?

Python + ZMQ : Operation cannot be accomplished in current state

python - 使用 Python 实现 collat​​z 函数

c++ - 构建复合对象时消除不必要的拷贝

objective-c - 如何优化翻阅已下载的 50 多张图片