我正在尝试加速以下代码来计算积分的总和。为了获得良好的准确性,我需要增加L_max,但这也会使执行时间更长。下面的具体情况计算概率曲线的0.999999,大约需要65秒。我听说过cython及其加速代码的能力,但我不知道如何使用它或在这种情况下如何帮助它。任何想法?
import math
from scipy import integrate
import numpy
from decimal import *
import time
start_time=time.time()
getcontext().prec=100
################################
def pt(t):
first_term=math.exp(-lam*t)*((0.0001*I)**ni)*(t**(ni-1))*math.exp(-(0.0001*I)*t)/(math.factorial(ni-1))
sum_term=0.0
i=0
while i<ni:
sum_term=sum_term+((0.0001*I)**i)*(t**(i))*math.exp(-(0.0001*I)*t)/(math.factorial(i))
i=i+1
sum_term=lam*math.exp(-lam*t)*sum_term
total=first_term+sum_term
return total
#################################
def pLgt(t):
return Decimal(((Decimal((0.0001*O)*t))**Decimal(L))*Decimal(math.exp(-(0.0001*O)*t)))/Decimal((math.factorial(L)))
######################################
def pL_t(t):
return (pLgt(t))*Decimal(pt(t))
################################
lam=0.0001
beta=0.0001
ni=10
I=5969
O=48170
L_max=300.0
L=0.0
sum_term=0.0
sum_probability=0.0
while L<L_max:
probability=(integrate.quad(lambda t: pL_t(t),0,800))[0]
sum_probability=sum_probability+probability
sum_term=sum_term+L*probability
L=L+1.0
print time.time()-start_time
print sum_probability
print sum_term
print (sum_term-1)*0.46+6.5
答案 0 :(得分:2)
在Decimal中进行计算可能会在不提供任何好处的情况下减慢您的速度。正如Kozyarchuk在Stack Overflow here上所指出的那样,十进制计算比浮点慢得多,慢约100倍。在Numpy数组中使用Decimal类型可以防止你从Numpy获得速度优势。
与此同时,我不清楚scipy.integrate.quad的结果实际上是你想要的精度水平;如果你真的需要任意精度,你可能需要从头编写正交代码。
如果您确实需要使用十进制数字,那么至少缓存这些数字的十进制表示将为您提供一些速度优势。也就是说,使用
O=Decimal(48170)
L=Decimal(0.0)
告诉pLgt只使用O和L,会更快。
答案 1 :(得分:0)
pL_t
函数看起来像是伽马分布的总和,在这种情况下,您应该能够将积分评估为部分不完整伽玛函数的总和:http://docs.scipy.org/doc/scipy/reference/generated/scipy.special.gdtr.html#scipy.special.gdtr