Я пытаюсь использовать 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
, но выдает следующее предупреждение:
/Пользователи /.../ 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: примечание: передача аргумента параметру 'callable' здесь 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)
Прекрасно работает. Мысли?