【发布时间】:2019-05-21 15:19:50
【问题描述】:
我尝试使用 python numba 更快地计算积分。即使使用 numba 进行单次计算的时间几乎快 10 倍,但当我循环重新定义积分的过程时,它变得非常慢。我尝试过使用其他装饰器,例如 @vectorize 或 @jit,但没有成功。有什么建议吗?
import numpy as np
import datetime as dd
from scipy.integrate import quad
from numba import cfunc, types, carray
tempText = 'Time Elapsed: {0:.6f} sec'
arr = np.arange(0.01,1.01,0.01)
out = np.zeros_like(arr)
def tryThis(): # beginner's solution
for i in range(len(arr)):
def integrand(t):
return np.exp(-arr[i]*t)/t**2
def do_integrate(func):
return quad(func,1,np.inf)[0]
out[i] = do_integrate(integrand)
# print (out)
init = dd.datetime.now()
tryThis()
print (tempText.format((dd.datetime.now()-init).total_seconds()))
经过的时间:0.047950 秒
def try2VectorizeThat(): # using numpy
def do_integrate(arr):
def integrand(t):
return np.exp(-arr*t)/t**2
return quad(integrand,1,np.inf)[0]
do_integrate = np.vectorize(do_integrate)
out = do_integrate(arr)
# print (out)
init = dd.datetime.now()
try2VectorizeThat()
print (tempText.format((dd.datetime.now()-init).total_seconds()))
经过的时间:0.026424 秒
def tryThisFaster(): # attempting to use numba
for i in range(len(arr)):
def get_integrand(*args):
a = args[0]
def integrand(t):
return np.exp(-a*t)/t**2
return integrand
nb_integrand = cfunc("float64(float64)")(get_integrand(arr[i]))
def do_integrate(func):
return quad(func,1,np.inf)[0]
out[i] = do_integrate(nb_integrand.ctypes)
# print (out)
init = dd.datetime.now()
tryThisFaster()
print (tempText.format((dd.datetime.now()-init).total_seconds()))
经过的时间:1.905140 秒
【问题讨论】:
标签: python arrays scipy integration numba