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

时间:2015-02-13 14:05:46

标签: python performance matlab logarithm

我试图加快以下代码:

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和长尾小鹦鹉包装,以及numpy函数而不是python函数,但根本没有任何改进。

我很感激任何帮助。 感谢。

编辑:整个事情是蒙特卡罗模拟,所以N非常大... 10e6 用于测试目的

2 个答案:

答案 0 :(得分:5)

你应该真正调查numpy。而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毫秒的运行时间。

答案 1 :(得分:1)

如果您使用的是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()?