python - 随机过程的循环优化

标签 python performance optimization

既然我调用了这段代码超过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 的性能。

关于python - 随机过程的循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23411853/

相关文章:

python - pandas 列中的连续值

java - HashSet vs ArrayList CPU 使用率高

performance - 在mysql中测试查询的性能

performance - 至强 CPU (E5-2603) 后向内存预取

c - 优化慢循环

python - 过滤 pandas DataFrame 的重复行

python - Django “TypeError: list() got an unexpected keyword argument ' ID ''” 错误

为联合结构编写可存储向量定义时的优化建议

python - Azure AD 是否有可用作身份验证服务器的服务?

java - 将日历存储在常量字段中以便稍后使用,避免在方法内创建它