使用@jitclass decorator进行类实例化

2024-06-09 14:53:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Numba的@jitclass装饰器,显然是为了加快代码的速度。我得到的错误似乎是为了对@jitclass有一个基本的理解


党卫军装饰师

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 "$0.45 = call $0.41($0.44, func=$0.41, args=[Var($0.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?>

Tags: selfnpzeroswidthatclassgridheight
1条回答
网友
1楼 · 发布于 2024-06-09 14:53:24

我没有太多地使用numba,这个jitclass没有,但是通过阅读文档和一些尝试和错误,我实现了这一点:

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包括所有字段/属性,而不是参数

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对数据类型也很挑剔

相关问题 更多 >