Class 使用@jitclass 装饰器实例化
Class Instantiation with @jitclass decorator
我正在尝试使用 Numba 的 @jitclass 装饰器,显然是为了加速我的代码。我收到的错误似乎是对@jitclass
的基本理解
ss 装饰器。
import numba
from numba import jitclass
spec = [('raster',numba.float32[:,:]),('height', numba.int32),
('width', numba.int32),('azis', numba. int64[:]),('grid',numba.int32),('rough',numba.float32[:,:])]#,('maxrange',numba.float32[:,:]),('azir atio',numba.float32[:,:]),('labels',numba.int32[:,:])]
@jitclass(spec)
class raster_class(object):
def __init__(self,raster):
self.raster = raster
self.height =self.raster.shape[0]
self.width = self.raster.shape[1]
self.azis = np.arange(0,170,10)
self.grid = 500
x,y = numba.int32(self.height/self.grid),numba.int32(self.width/self.grid)
self.rough = np.zeros((x,y),dtype=np.float32)
self.maxrange = np.zeros((self.height/self.grid),(self.width/self.grid))
self.aziratio = self.rough.copy()
self.labels = self.rough.copy()
if __name__ == '__main__':
raster = np.zeros(1000,1000)
raster_class = raster_class(raster)
产生的错误:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Internal error at <numba.typeinfer.CallConstraint object at 0x7f19b3ce5128>:
File "processraster.py", line 24:
def __init__(self,raster):
<source elided>
self.azis = np.arange(0,170,10)
self.grid = 500
^
[1] During: lowering "[=12=].45 = call [=12=].41([=12=].44, func=[=12=].41, args=[Var([=12=].44, /home/dunbar/DEM/processraster.py (24))], kws=(), vararg=None)" at /home/dunbar/DEM/processraster.py (24)
[2] During: resolving callee type: jitclass.raster_class#7f19a049f828<raster:array(float32, 2d, A),height:int32,width:int32,azis:array(int64, 1d, A),grid:int32,rough:array(float32, 2d, A)>
[3] During: typing of call at <string> (3)
--%<----------------------------------------------------------------------------
File "<string>", line 3:
<source missing, REPL/exec in use?>
我没怎么用过 numba
,这个 jitclass
none,但是通过阅读文档和一些试验和错误,我得到了这个工作:
In [308]: spec = [('raster',numba.float32[:,:]),('height', numba.int32),('width', numba.int32),('azis', numba.int64[:])]
In [309]: @numba.jitclass(spec)
...: class raster_class():
...: def __init__ (self,raster):
...: self.raster = raster
...: self.height = self.raster.shape[0]
...: self.width = self.raster.shape[1]
...: self.azis = np.arange(0,170,10)
...:
请注意 spec
包括 所有 fields/attributes,而不是参数。
In [310]: raster_class(np.zeros((3,2),'float32'))
Out[310]: <numba.jitclass.boxing.raster_class at 0x7fe67f11f090>
In [311]: foo = _
In [312]: foo.width
Out[312]: 2
In [313]: foo.azis
Out[313]:
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160])
另外 numba
对数据类型很挑剔。
我正在尝试使用 Numba 的 @jitclass 装饰器,显然是为了加速我的代码。我收到的错误似乎是对@jitclass
的基本理解ss 装饰器。
import numba
from numba import jitclass
spec = [('raster',numba.float32[:,:]),('height', numba.int32),
('width', numba.int32),('azis', numba. int64[:]),('grid',numba.int32),('rough',numba.float32[:,:])]#,('maxrange',numba.float32[:,:]),('azir atio',numba.float32[:,:]),('labels',numba.int32[:,:])]
@jitclass(spec)
class raster_class(object):
def __init__(self,raster):
self.raster = raster
self.height =self.raster.shape[0]
self.width = self.raster.shape[1]
self.azis = np.arange(0,170,10)
self.grid = 500
x,y = numba.int32(self.height/self.grid),numba.int32(self.width/self.grid)
self.rough = np.zeros((x,y),dtype=np.float32)
self.maxrange = np.zeros((self.height/self.grid),(self.width/self.grid))
self.aziratio = self.rough.copy()
self.labels = self.rough.copy()
if __name__ == '__main__':
raster = np.zeros(1000,1000)
raster_class = raster_class(raster)
产生的错误:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Internal error at <numba.typeinfer.CallConstraint object at 0x7f19b3ce5128>:
File "processraster.py", line 24:
def __init__(self,raster):
<source elided>
self.azis = np.arange(0,170,10)
self.grid = 500
^
[1] During: lowering "[=12=].45 = call [=12=].41([=12=].44, func=[=12=].41, args=[Var([=12=].44, /home/dunbar/DEM/processraster.py (24))], kws=(), vararg=None)" at /home/dunbar/DEM/processraster.py (24)
[2] During: resolving callee type: jitclass.raster_class#7f19a049f828<raster:array(float32, 2d, A),height:int32,width:int32,azis:array(int64, 1d, A),grid:int32,rough:array(float32, 2d, A)>
[3] During: typing of call at <string> (3)
--%<----------------------------------------------------------------------------
File "<string>", line 3:
<source missing, REPL/exec in use?>
我没怎么用过 numba
,这个 jitclass
none,但是通过阅读文档和一些试验和错误,我得到了这个工作:
In [308]: spec = [('raster',numba.float32[:,:]),('height', numba.int32),('width', numba.int32),('azis', numba.int64[:])]
In [309]: @numba.jitclass(spec)
...: class raster_class():
...: def __init__ (self,raster):
...: self.raster = raster
...: self.height = self.raster.shape[0]
...: self.width = self.raster.shape[1]
...: self.azis = np.arange(0,170,10)
...:
请注意 spec
包括 所有 fields/attributes,而不是参数。
In [310]: raster_class(np.zeros((3,2),'float32'))
Out[310]: <numba.jitclass.boxing.raster_class at 0x7fe67f11f090>
In [311]: foo = _
In [312]: foo.width
Out[312]: 2
In [313]: foo.azis
Out[313]:
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160])
另外 numba
对数据类型很挑剔。