Jac*_*ley 2 python random optimization numbers python-3.x
我想在一个范围内生成八个随机数(0到pi/8),将它们加在一起,取这个和的正弦值,然后这样做N次,得到平均结果.在缩放之后,我得到了正确的答案,但它太慢了N > 10^6,特别是当我平均n_t = 25多次N 次试验时!我目前得到这个代码奔波在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))
Run Code Online (Sandbox Code Playgroud)
如果有人可以帮助我优化这一点,将不胜感激!
谢谢 :)
鉴于你需要用这种方法获得结果,np.sin(np.random.uniform(0,np.pi/8,size=(8,10**6,25)).sum(axis=0)).mean(axis=0)你可以很快得到你的25次试验...这是完全矢量化的(简洁而且总是奖金!)所以我怀疑你能做得更好......
说明:
您生成一个大的随机3d数组(8 x 10**6 x 25)..sum(axis=0)会得到第一个维度的总和(8).np.sin(...)应用元素..mean(axis=0)将获得第一个剩余维度(10**6)的平均值,并为您留下与25您的试验相对应的1d长度()数组.