Calling Cython functions from Numba jitted code(从Numba JILED代码调用Cython函数)
问题描述
我知道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的挂钩:
http://numba.pydata.org/numba-doc/latest/reference/pysupported.html#cffi
可以利用这一点在C代码外部调用,如果您可以在C级别创建一个低级包装器,那么您可能能够准备好调用Cython;不过,我不能100%确定这是否可能。我写过这样做是为了从Numba调用RMath函数:
https://web.archive.org/web/20160611082327/https://www.continuum.io/blog/developer-blog/calling-c-libraries-numba-using-cffi
如果您选择该路线,可能会对您开始有所帮助。
这篇关于从Numba JILED代码调用Cython函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从Numba JILED代码调用Cython函数
基础教程推荐
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
