Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在加速scipy.integrate.quad()?_Python_Performance_Numpy_Integration_Numerical - Fatal编程技术网

Python 正在加速scipy.integrate.quad()?

Python 正在加速scipy.integrate.quad()?,python,performance,numpy,integration,numerical,Python,Performance,Numpy,Integration,Numerical,我试图加速下面的代码,它计算积分的和。为了获得良好的精度,我需要增加L_max,但这也使得执行时间更长。下面的具体情况计算概率曲线的0.999999,大约需要65秒。我听说过cython及其加速代码的能力,但我不知道如何使用它,也不知道它在这种情况下有什么帮助。有什么想法吗 import math from scipy import integrate import numpy from decimal import * import time start_time=time.time() g

我试图加速下面的代码,它计算积分的和。为了获得良好的精度,我需要增加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 
导入数学
从scipy导入集成
进口numpy
从十进制输入*
导入时间
开始时间=time.time()
getcontext().prec=100
################################
def pt(t):
第一项=数学经验(-lam*t)*((0.0001*I)**ni)*(t**(ni-1))*数学经验(-0.0001*I)*t)/(数学阶乘(ni-1))
求和项=0.0
i=0

而我用十进制进行计算可能会大大降低速度,但不会带来任何好处。正如Kozyarcuk在堆栈溢出问题上指出的那样,十进制计算比浮点运算慢很多,大约慢100倍。在Numpy数组中使用十进制类型会使您无法从Numpy中获得速度优势

同时,我不清楚scipy.integrate.quad的结果是否达到了您想要的精度水平;如果您确实需要任意精度,您可能必须从头开始编写正交代码

如果您确实需要使用十进制数字,至少缓存这些数字的十进制表示形式将为您提供一些速度优势。即使用

O=Decimal(48170)
L=Decimal(0.0)

告诉pLgt只使用O和L会更快。

函数看起来像伽马分布的总和,在这种情况下,您应该能够将积分计算为部分不完整伽马函数的和:

考虑使用cProfile来找出代码中哪些是较慢的部分
python-mcprofile script.py