如何提高布朗运动蒙特卡洛模拟速度?

pyt*_*e22 5 python montecarlo stochastic event-simulation

我想让我的代码更快地运行,以进行更多的迭代和运行。现在,我的代码太慢了,但是我不知道要更改什么来加速它。我首先编写了动力学的蒙特卡洛模拟,然后将其编辑为布朗运动模拟。我当前的代码无法处理10,000次运行,每次运行10,000次迭代。

import numpy as np
import matplotlib.pyplot as plt
import time
%matplotlib inline

runs = int(input("Enter number of runs: "))
N = int(input("Enter number of iterations per simulation: "))

y = 0
R = 10*1  # R is the rate value
t0 = time.time()
for y in range(runs):  # Run the simulation 'runs' times
    T = np.array([0])
    dt = 0
    x = 0.5  # sets values 
    X = np.array([x])
    t = 0
    i = 0

    while t < N:  # N is the number of iterations per run
        i = i + 1  # i is number of iterations so far
        z = np.random.uniform(-1, 1, 1)  # sets z to be a random number between -1 to 1 size 1

        if z > (1/3):  # if conditions for z for alpha and gamma, beta 
            x = x + 1  # z[]=alpha state then + 1
        elif z < (-1/3):
            x = x-1  # z[]=gamma state then - 1
        elif z < (1/3) and z > (-1/3):
            x = x  # z=beta state then + 0

        X = np.append(X, x)  # adds new X value to original X array
        X[i] += X[i-1] * 0.01 * np.random.normal(0, 1, 1) * np.sqrt(dt)  # for Brownian motion with sigma as 0.01
        Z = np.random.uniform(0, 1)  # sets Z to be a random number between 0 and 1
        dt = 1/R * np.log(1/Z)  # formula for dt; R is the rate value
        t = t + dt  # ITERATED TIME
        T = np.append(T, t)
        plt.plot(T, X, lw='0.5', alpha=0.5)

t1 = time.time()
print("final %.10f seconds " % (t1-t0))
Run Code Online (Sandbox Code Playgroud)

Mon*_*ims 1

这是快速运行的布朗运动蒙特卡罗模拟的一个很好的例子,它的计算成本较低。

我过去做过与您相同的事情,并使每次迭代的每个步骤都在嵌套循环中进行。也许是上下文切换、运行不同的库、或者只是内存不足的成本,但在每次迭代中运行代码的每个步骤肯定会带来更慢的性能和更高的内存使用。

在上面的示例中,作者首先创建数组然后使用单个 for 循环相应地迭代它们。所有随机数同时生成并放入一个数组中。然后同时计算所有布朗运动返回。(想象一下装配线 - 在每个步骤中充分利用资源并实现规模经济。)同样重要的是,请注意 plt 函数仅运行一次(不在循环内)并且仅在所有迭代完成之后才运行。完全的。

该方法应该允许在更小的硬件上进行更多的迭代。