Numba JIT给出LoweringError,尽管代码可以正常工作

时间:2019-03-21 21:53:36

标签: python-3.x math jit mandelbrot

我在python中有以下代码来计算Mandelbrot集。它可以正常工作,但是当我尝试通过在函数def之前添加@jit装饰器来使用JIT对其进行编译时,它将不再起作用。谁能告诉我为什么?如果您不批评我的Mandelbrot计算(我想可以对其进行优化),并且让我知道为什么JIT不能使用此功能,我将不胜感激。顺便说一下,代码在def之后缩进。当我将其插入此处时,它并没有以这种方式出现。

def mandelbrot(xmin,xmax,ymin,ymax,width,height,maxiter):
points=[]
x=np.linspace(xmin,xmax,width)
y=np.linspace(ymin,ymax,height)
for ix,re in enumerate(x):
    points.append([])
    for iy,im in enumerate(y):
        cx=re
        cy=im
        zx=0
        zy=0
        for n in range(maxiter):
            if zx*zx+zy*zy>4.0:
                iters=n
                break
            else:
                oldzx=zx
                oldzy=zy
                zy = 2*oldzx*oldzy+cy
                zx = oldzx*oldzx-oldzy*oldzy+cx  
                iters=n
        points[ix].append(int(iters))
return points

我收到以下错误报告,最后一行是LoweringError

  

runfile('D:/ python程序/mandelbrot/mandelbrot.py',wdir ='D:/ python   程序/ mandelbrot')追溯(最近一次通话结束):

     

文件“”,第1行,在       runfile('D:/ python程序/mandelbrot/mandelbrot.py',wdir ='D:/ python程序/ mandelbrot')

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py”,   运行文件中的第786行       execfile(文件名,命名空间)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py”,   第110行,在execfile中       exec(compile(f.read(),文件名,'exec'),命名空间)

     

文件“ D:/ python程序/mandelbrot/mandelbrot.py”,第41行,在          mandelbrot_set = mandelbrot(-2.0,1.0,-1.5,1.5,500,500,50)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ dispatcher.py”,   第368行,在_compile_for_args中       提高e

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ dispatcher.py”,   _compile_for_args中的第325行       返回self.compile(tuple(argtypes))

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ dispatcher.py”,   编译中的第653行       cres = self._compiler.compile(args,return_type)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ dispatcher.py”,   第83行,正在编译       pipeline_class = self.pipeline_class)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   873,在compile_extra       返回pipeline.compile_extra(func)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   367,在compile_extra中       返回self._compile_bytecode()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   804,_compile_bytecode       返回self._compile_core()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   791,在_compile_core中       res = pm.run(self.status)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   253,运行中       提高patched_exception

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   245,在运行中       stage()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   438,在stage_objectmode_frontend中       cres = self.frontend_looplift()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   428,位于frontend_looplift       Lifted = tuple(loops),lifted_from = None)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   887,在compile_ir中       lifted_from = lifted_from)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   375,在compile_ir中       返回self._compile_ir()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   811,在_compile_ir中       返回self._compile_core()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   791,在_compile_core中       res = pm.run(self.status)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   253,运行中       提高patched_exception

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   245,在运行中       stage()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   652,在stage_objectmode_backend中       self._backend(lowerfn,objectmode = True)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   628,在_backend中       降低= lowerfn()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   601,处于backend_object_mode       self.flags)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ compiler.py”,行   1018,处于py_lowering_stage       lower.lower()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ lowering.py”,行   173以下       self.lower_normal_function(self.fndesc)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ lowering.py”,行   214,在lower_normal_function中       entry_block_tail = self.lower_function_body()

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ lowering.py”,行   239,在lower_function_body中       self.lower_block(block)

     

文件   “ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ lowering.py”,行   254,在lower_block中       self.lower_inst(inst)

     

文件“ C:\ Users \ Matthew \ Anaconda3 \ lib \ contextlib.py”,第130行,在   退出       self.gen.throw(类型,值,回溯)

     

文件“ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ errors.py”,   第585行,在new_error_context中       six.reraise(type(newerr),newerr,tb)

     

文件“ C:\ Users \ Matthew \ Anaconda3 \ lib \ site-packages \ numba \ six.py”,   659行,正在重新筹集       提高价值

     

LoweringError:迭代

     

文件“ mandelbrot.py”,第17行:def   mandelbrot(xmin,xmax,ymin,ymax,width,height,maxiter):              对于ix,枚举(x):           points.append([])           ^

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。似乎我需要在循环开始时将变量“ iters”初始化为0。因此,当我将@jit放在前面时,此方法有效。有人知道为什么吗?

def mandelbrot(xmin,xmax,ymin,ymax,width,height,maxiter):
points=[]
x=np.linspace(xmin,xmax,width)
y=np.linspace(ymin,ymax,height)
for ix,re in enumerate(x):
    points.append([])
    for iy,im in enumerate(y):
        iters=0
        cx=re
        cy=im
        zx=0
        zy=0
        for n in range(maxiter):
            if zx*zx+zy*zy>4.0:
                iters=n
                break
            else:
                oldzx=zx
                oldzy=zy
                zy = 2*oldzx*oldzy+cy
                zx = oldzx*oldzx-oldzy*oldzy+cx  
                iters=n
        points[ix].append(iters)
return points