从Numba JILED代码调用Cython函数

本教程将介绍从Numba JILED代码调用Cython函数的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

从Numba JILED代码调用Cython函数 教程 第1张

问题描述

我知道Numba-jited函数调用另一个jited函数会识别到这一点,并自动使用快速的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

cpdef double foo(double x):
 return x**2

以及标准的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可调用函数,还是需要通过设置CFFI包装等方式手动告知?

编辑:进一步思考,从Python解释器的角度来看,Cython函数只是标准的"内置"函数。因此,问题可以变得更一般:Numba是否优化了对内置函数和方法的调用,以绕过Python调用开销?

推荐答案

Numba知道怎么将其转换为本机代码的内置函数集有限:

    http://numba.pydata.org/numba-doc/latest/reference/pysupported.html

    http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html

Numba将无法在nopython模式下执行任何其他操作,因此求助于速度慢得多的objectmode

没有直接的方法将cython函数传递给Numba并使其在nopython模式下被识别。Numba确实有用于CFFI的挂钩:

可以利用这一点在C代码外部调用,如果您可以在C级别创建一个低级包装器,那么您可能能够准备好调用Cython;不过,我不能100%确定这是否可能。我写过这样做是为了从Numba调用RMath函数:

如果您选择该路线,可能会对您开始有所帮助。

好了关于从Numba JILED代码调用Cython函数的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。