[英]Any way to speed up runs?
我目前正在尝试进行蒙特卡洛模拟,问题是它需要相当长的时间才能运行 100,000 次或更多次,而我告诉它不应该花很长时间。
这是我的代码:
runs = 10000
import matplotlib.pyplot as plt
import random
import numpy as np
from scipy.stats import norm
from scipy.stats import uniform
import seaborn as sns
import pandas
def steadystate():
p=0.88
Cout=4700000000
LambdaAER=0.72
Vol=44.5
Depo=0.42
Uptime=0.1
Effic=0.38
Recirc=4.3
x = random.randint(86900000,2230000000000)
conc = ((p*Cout*LambdaAER)+(x/Vol))/(LambdaAER+Depo+(Uptime*Effic*Recirc))
return conc
x = 0
while x < runs:
#results = steadystate (Faster)
results = np.array([steadystate() for _ in range(1000)])
print(results)
x+=1
ax = sns.distplot(results,
bins=100,
kde=True,
color='skyblue',
hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Uniform Distribution ', ylabel='Frequency')
我是 python 的新人,所以我不确定在哪里优化我的代码。 任何帮助或建议将不胜感激。
您实际上并没有从此处的numpy
中受益,因为您一次生成每个值,对那个值进行所有数学运算,然后从结果生成数组。 从一开始就使用 arrays,对所有元素进行批量处理,以获得矢量化的好处:
import numpy.random
def steadystate(count): # Receive desired number of values for bulk generation
p=0.88
Cout=4700000000
LambdaAER=0.72
Vol=44.5
Depo=0.42
Uptime=0.1
Effic=0.38
Recirc=4.3
x = numpy.random.randint(86900000, 2230000000000, count) # Make array of count values all at once
# Perform all the math in bulk
conc = ((p*Cout*LambdaAER)+(x/Vol))/(LambdaAER+Depo+(Uptime*Effic*Recirc))
return conc
x = 0
while x < runs:
results = steadystate(1000) # Just call with number of desired items
print(results)
x+=1
请注意,此代码通过每次替换results
而不是累积结果来匹配您的原始代码。 我不清楚你该怎么做,所以这只是在更快地做(可能)错误的事情。
您损失的大约 70% 的时间是随机数的创建。 问题是你是否每次都需要随机数? 仅生成一次随机矩阵并重新使用它就足够了吗?
但是,代码非常快,不是吗。 除了绘图部分,这个 par 只花了 1.2 ms 进行一次迭代。
%timeit results = np.array([steadystate() for _ in range(1000)])
1.24 ms ± 3.35 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.