我试图加快以下代码:
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 用于测试目的
答案 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()?