Skip to main content
 首页 » 编程设计

python之随机过程的循环优化

2025年05月04日17oomusou

既然我调用了这段代码超过1000次,有没有办法优化这段耗时1.73s的代码?

def generate(): 
    S0    = 0 
    T     = 1. 
    nt    = 100000 
    lbd   = 500. 
    mu    = 0 
    sigma = 1. 
 
    dt = T/nt 
    St  = [S0]  * nt 
    sqrtdt = np.sqrt(dt) 
    dBt = np.random.normal(0, sqrtdt, nt) 
 
    for k in xrange(1, nt): 
        dSt = lbd * (mu - St[k-1]) * dt + sigma * dBt[k] 
        St[k] = St[k-1] + dSt 
    return St 

请您参考如下方法:

您可以从 for 循环 中挤出更多工作,但同时生成所有路径(假设您有足够的内存):

import numpy as np 
 
def generate_orig(T=1., nt=100000, lbd=500., mu=0, sigma=1., S0=0): 
    dt = T/nt 
    St  = [S0]  * nt 
    sqrtdt = np.sqrt(dt) 
    dBt = np.random.normal(0, sqrtdt, nt) 
 
    for k in xrange(1, nt): 
        dSt = lbd * (mu - St[k-1]) * dt + sigma * dBt[k] 
        St[k] = St[k-1] + dSt 
    return St 
 
def generate(T=1., nt=100000, lbd=500., mu=0, sigma=1., S0=0, npaths=1): 
    dt = T/nt 
    St  = np.full((nt, npaths), S0) 
    sqrtdt = np.sqrt(dt) 
    dBt = np.random.normal(0, sqrtdt, size=(nt, npaths)) 
 
    for k in xrange(1, nt): 
        dSt = lbd * (mu - St[k-1]) * dt + sigma * dBt[k] 
        St[k] = St[k-1] + dSt 
    return St 

这是 100 条路径上的 timeit 基准。

In [55]: %timeit [generate_orig() for i in xrange(100)] 
1 loops, best of 3: 23.6 s per loop 
 
In [56]: %timeit generate(npaths=100) 
1 loops, best of 3: 1.97 s per loop 

您还可以通过使用 Cython 提高 for-loop 的性能。