用 Python 中的对数加速一个大循环

Speeding up a big a loop with a logarithm in Python

我正在尝试加速以下代码:

from math import log
from random import random

def logtest1(N):
    tr=0
    for i in range(1,N):
        T= 40 + 10*random()
        tr += -log(random())/T

我是 python 的新手(来自 matlab)...同样的代码在 python 中的运行速度比 matlab(和 Julia)慢 5 倍,这引起了我的注意。

我尝试使用 numba 和 parakeet 包装器,以及 numpy 函数而不是 python 函数,但根本没有得到任何改进。

如果有任何帮助,我将不胜感激。 谢谢

编辑:整个过程是 Monte Carlo 模拟,所以 N 非常大... 10e6 用于测试目的

如果你使用 Python 2.7x,马上就说使用 xrange 所以在 2.7 中它将是:

def logtest1(N):
    tr=0
    for i in xrange(N):  
        a = random()   # Just generate the random number once
        T= 40 + 10*a
        tr += -log(a)/T

这里总结了为什么 xrange 更好:Should you always favor xrange() over range()?

你应该真的在调查numpy. And Scipy的时候。 Numpy 是 N 维数组数值的速度优化包,Scipy 是建立在 numpy 上的科学计算的集合。

如果你使用 numpy 数组编写函数,它看起来像这样:

def logtest2(N):
    T = 40. + 10. * np.random.rand(N)
    return np.sum(-1*np.log(np.random.rand(N)) / T)

它也快了很多。使用 N = 1000000 进行测试,您的版本运行时间为 500 毫秒,此版本运行时间为 75 毫秒。