我在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([]) ^
答案 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