我想让我的代码更快地运行,以进行更多的迭代和运行。现在,我的代码太慢了,但是我不知道要更改什么来加快它的速度。
我首先编写了动力学的蒙特卡洛模拟,然后将其编辑为布朗运动模拟。我当前的代码无法处理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))
最佳答案
快速运行的布朗运动蒙特卡洛模拟的Here is an excellent example,其计算开销较小。
我过去做过与您相同的事情,并使每次迭代的每个步骤都在嵌套循环中进行。可能是上下文切换,通过不同的库运行或只是耗尽内存的成本,但是在每次迭代中运行代码的每一步肯定会导致性能降低和内存使用率增加。
在上面的示例中,作者首先创建数组,然后使用一个for循环对它们进行相应的迭代。生成所有随机数,并将它们同时放入一个数组中。然后,同时计算所有布朗运动 yield 。 (想想一条装配线-在每个步骤上都很好地利用资源并实现规模经济。)同样重要的是,请注意,plt函数仅运行一次(不在循环内),并且仅在所有迭代之后运行完全的。
此方法应允许在更小的硬件上进行大量的迭代。