从Numba jitted cod调用Cython函数

2024-10-06 12:37:32 发布

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

我知道一个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

^{pr2}$

以及一个标准的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调用开销?在


Tags: 函数importreturnfoodefbarbethis
1条回答
网友
1楼 · 发布于 2024-10-06 12:37:32

有一组有限的内置函数(来自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

如果你走那条路,可能会对你有帮助。在

相关问题 更多 >