我知道一个Numba jitted函数调用另一个jitted函数会认识到这一点,并自动使用快速C调用约定,而不是遍历Python对象层,因此避免了高Python函数调用开销:
import numba
@numba.jit
def foo(x):
return x**2
@numba.jit
def bar(x):
return 4 * foo(x) # this will be a fast function call
我的问题是,如果我从Numba调用一个Cython函数,是否也是这样。假设我有一个Cython模块,foo.pyx
:
以及一个标准的Python模块bar.py
:
import numba
import foo
@numba.jit
def bar(x):
return 4 * foo.foo(x) # will this be a fast function call?
Numba会自动将foo.foo
识别为一个C-callable函数,还是需要手动告诉它,比如设置一个CFFI包装器?在
编辑:进一步思考后,从Python解释器的角度来看,Cython函数只是标准的“内置”函数。所以问题可以变得更一般:Numba是否优化了对内置函数和方法的调用,以绕过Python调用开销?在
有一组有限的内置函数(来自python标准库和numpy),numba知道如何将其转换为本机代码:
http://numba.pydata.org/numba-doc/latest/reference/pysupported.htmlhttp://numba.pydata.org/numba-doc/latest/reference/numpysupported.html
在
nopython
模式下,Numba无法对其他任何东西进行jit,因此求助于速度慢得多的objectmode
。在没有直接的方法将cython函数传递给Numba并让它在
nopython
模式下被识别。Numba确实有cffi的钩子:http://numba.pydata.org/numba-doc/latest/reference/pysupported.html#cffi
这可以用来调用C代码之外的代码,如果可以在C级别创建一个低级别的包装器,那么就可以调用cython;但是我不能百分之百确定这是否可行。我写过这样做是为了从Numba调用RMath函数:
https://www.continuum.io/blog/developer-blog/calling-c-libraries-numba-using-cffi
如果你走那条路,可能会对你有帮助。在
相关问题 更多 >
编程相关推荐