0

我正在尝试使用numba来加快慢速计算。它与@njit装饰器配合得很好,但我真的需要它作为预编译的提前(AOT) 模块工作。可悲的是,我无法让它工作。这是我用来编译 AOT 模块的代码:

from numba.pycc import CC
import numpy as np

cc = CC('window_cloud_scores')
cc.verbose = True
cc.output_dir='/cache'
cc.output_file='window_cloud_scores.so'


@cc.export('run', 'f8[:,:](u1[:,:], i4)')
def run(clouds,window):
    r=int(window/2)
    assert clouds.ndim==2
    assert clouds.shape[0]==clouds.shape[1]
    rows,cols=clouds.shape
    score_map=np.full(clouds.shape,-1)
    scores=[]
    for j in range(r,rows-r):
        score_cols=[]
        for i in range(r,cols-r):
            clouds_window=clouds[j-r:j+r+1,i-r:i+r+1]
            score_cols.append(clouds_window.mean())
        scores.append(score_cols)
    return np.array(scores)


if __name__ == "__main__":
    cc.compile()

当我编译模块时,它会创建window_cloud_scores.so文件但给出以下警告:

/Users/.../lib/python3.6/site-packages/numba/pycc/../runtime/_nrt_python.c:234:55:警告:传递'PyTypeObject *'的指针类型不兼容(又名'struct _typeobject * ') 到'PyObject *' 类型的参数(又名'struct _object') [-Wincompatible-pointer-types] mi = (MemInfoObject )PyObject_CallFunctionObjArgs(&MemInfoType, addr, NULL); ^~~~~~~~~~~~ /Users/.../python3.6m/abstract.h:425:68:注意:在此处将参数传递给参数“可调用” PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *可调用,

然后当我尝试跑步时

import window_cloud_scores as wcs
wcs.run(...)

segmentation fault: 11在 python 控制台中得到一个,它是一个内核死掉的 jupyter 笔记本。

然后再次,

@njit
def run(clouds,window):
    r=int(window/2)
    assert clouds.ndim==2
    assert clouds.shape[0]==clouds.shape[1]
    rows,cols=clouds.shape
    score_map=np.full(clouds.shape,-1)
    scores=[]
    for j in range(r,rows-r):
        score_cols=[]
        for i in range(r,cols-r):
            clouds_window=clouds[j-r:j+r+1,i-r:i+r+1]
            score_cols.append(clouds_window.mean())
        scores.append(score_cols)
    return np.array(scores)

效果很好。想法?

4

0 回答 0