Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.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 Numba 0.37中的打字员_Python_Python 2.7_Numpy_Jit_Numba - Fatal编程技术网

Python Numba 0.37中的打字员

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 =

我正在尝试优化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 = []
    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调用,则会抛出错误(如您所经历的)