Python Numba 0.37中的打字员
我正在尝试优化Python代码,以便计算以下公式: 其中,phi是二维数组,phi_i是一维数组。 我已经为它构建了一个代码,并尝试使用jit装饰器,但它给了我TypingError。这是我使用的代码:Python Numba 0.37中的打字员,python,python-2.7,numpy,jit,numba,Python,Python 2.7,Numpy,Jit,Numba,我正在尝试优化Python代码,以便计算以下公式: 其中,phi是二维数组,phi_i是一维数组。 我已经为它构建了一个代码,并尝试使用jit装饰器,但它给了我TypingError。这是我使用的代码: import numpy as np from numba import jit @jit(nopython=True) def calcAlpha(phi,fix_phis): phi_sq = phi**2 fix_phis_sq = fix_phis**2 F =
import numpy as np
from numba import jit
@jit(nopython=True)
def calcAlpha(phi,fix_phis):
phi_sq = phi**2
fix_phis_sq = fix_phis**2
F = []
for l,phi_l_sq in enumerate(fix_phis_sq):
F.append(2.0*phi_sq/(phi_sq-phi_l_sq))
# print F[l]
for j,phi_j_sq in enumerate(fix_phis_sq):
if j != l:
F[l]*=(phi_sq - phi_j_sq)/(phi_l_sq + phi_j_sq)
F[l]*=(phi_l_sq + phi_j_sq)/(phi_sq + phi_j_sq)
return np.array(F)
fix_sigmas=np.linspace(0.1,1,8)
sigma = np.random.random((252,252))
尝试运行该函数时会显示以下消息:
In [7]: fout=calcAlpha(sigma,fix_sigmas)
---------------------------------------------------------------------------
TypingError Traceback (most recent call last)
<ipython-input-7-88b11ed9cd73> in <module>()
----> 1 fout=calcAlpha(sigma,fix_sigmas)
../anaconda2/lib/python2.7/site-packages/numba/dispatcher.pyc in _compile_for_args(self, *args, **kws)
328 for i, err in failed_args))
329 e.patch_message(msg)
--> 330 raise e
331
332 def inspect_llvm(self, signature=None):
TypingError: Caused By:
Traceback (most recent call last):
File "../anaconda2/lib/python2.7/site-packages/numba/compiler.py", line 240, in run
stage()
File "../anaconda2/lib/python2.7/site-packages/numba/compiler.py", line 454, in stage_nopython_frontend
self.locals)
File "../anaconda2/lib/python2.7/site-packages/numba/compiler.py", line 881, in type_inference_stage
infer.propagate()
File "../anaconda2/lib/python2.7/site-packages/numba/typeinfer.py", line 846, in propagate
raise errors[0]
TypingError: Invalid usage of Function(<built-in function array>) with parameters (list(array(float64, 2d, C)))
* parameterized
In definition 0:
TypingError: array(float64, 2d, C) not allowed in a homogenous sequence
...
Failed at nopython (nopython frontend)
Invalid usage of Function(<built-in function array>) with parameters (list(array(float64, 2d, C)))
* parameterized
In definition 0:
TypingError: array(float64, 2d, C) not allowed in a homogenous sequence
[7]中的:fout=calcAlpha(sigma,fix_sigmas)
---------------------------------------------------------------------------
打字机错误回溯(最近一次呼叫最后一次)
在()
---->1 fout=钙质(西格玛,固定西格玛)
../anaconda2/lib/python2.7/site-packages/numba/dispatcher.pyc in _compile_for_args(self,*args,**kws)
328对于i,在失败的参数中出错)
329 e.patch_信息(msg)
-->330升e
331
332 def inspect_llvm(自身,签名=无):
打字员:由以下原因引起:
回溯(最近一次呼叫最后一次):
文件“./anaconda2/lib/python2.7/site packages/numba/compiler.py”,第240行,正在运行
阶段(
文件“./anaconda2/lib/python2.7/site packages/numba/compiler.py”,第454行,在stage\u nopython\u前端
(本地人)
文件“./anaconda2/lib/python2.7/site packages/numba/compiler.py”,第881行,在类型推理阶段
推断.传播()
文件“./anaconda2/lib/python2.7/site packages/numba/typeinfer.py”,第846行,在propagate中
引发错误[0]
TypingError:函数()与参数(列表(数组(float64,2d,C))的用法无效
*参数化
在定义0中:
TypingError:同质序列中不允许使用数组(float64,2d,C)
...
在nopython(nopython前端)失败
函数()与参数(列表(数组(float64,2d,C))的用法无效
*参数化
在定义0中:
TypingError:同质序列中不允许使用数组(float64,2d,C)
不支持将数组附加到列表中,如果以后支持,如果可以避免,则不建议使用。
此外,建议使用Numba写出所有循环以获得最佳性能
示例
@nb.njit(fastmath=True,parallel=True)
def calcAlpha(phi,fix_phis):
phi_sq = phi*phi
fix_phis_sq = fix_phis*fix_phis #1d
F = np.zeros((fix_phis_sq.shape[0],phi.shape[0],phi.shape[1]),dtype=phi.dtype)
for l in nb.prange(fix_phis_sq.shape[0]):
for x in range(phi_sq.shape[0]):
for y in range(phi_sq.shape[1]):
F[l,x,y]=2.0*phi_sq[x,y]/(phi_sq[x,y]-fix_phis_sq[l])
#if fix_phis doesn't get bigger, but phi does parallelize this loop
for j in range(fix_phis_sq.shape[0]):
if j != l:
for x in range(phi_sq.shape[0]):
for y in range(phi_sq.shape[1]):
F[l,x,y]*=(phi_sq[x,y] - fix_phis_sq[j])/(fix_phis_sq[l] + fix_phis_sq[j])
F[l,x,y]*=(fix_phis_sq[l] + fix_phis_sq[j])/(phi_sq[x,y] + fix_phis_sq[j])
return F
大部分加速(我的Quadcore-i7上的7x)都来自并行化。谢谢,我会尝试一下。.我试图找出jit和njit之间的区别,但找不到明确的解释-你能说一句话吗?njit是jit的捷径(nopython=True)。如果使用不带参数的jit或nopython=False,则可能会与Python解释器(例如,将数组附加到列表中)、jit(nopython=True)或njit发生交互,如果需要Python调用,则会抛出错误(如您所经历的)