繁体   English   中英

有什么方法可以加快运行速度?

[英]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.

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