如何在Python 2.7中使用numba JIT编译器提高math.sqrt()速度
我有一个复杂的函数,它执行一些无法用向量化方式处理的数学运算。我发现使用NUMBA的jit编译器反而让性能变慢了。这可能是因为我在这个函数里调用了Python的math.sqrt。请问我怎么才能让NUMBA把对Python的math.sqrt的调用替换成更快的C语言的sqrt函数呢?
-- 祝好 Kes
2 个回答
1
Numba已经把math.sqrt
这个函数的调用映射到了libc里的sqrt
/sqrtf
。性能下降可能是因为Numba本身的开销。这个开销主要来自于处理Python对象(也就是PyObjects)的过程,以及在编译后的代码中检查是否发生了错误。这种开销在从Python调用小函数时影响较大,但如果是从另一个Numba编译的函数调用,就影响小很多,因为那时候不需要处理Python对象。
如果你设置环境变量NUMBA_OPT=3
,那么会开启一种更激进的优化方式,这样可以减少一些开销,但会增加代码生成的时间。
4
Numba已经把调用math.sqrt的部分替换成了直接调用机器代码库里的sqrt函数。所以,如果你发现性能变慢,可能是其他原因导致的。
你能把你想要加速的代码发出来吗?还有,你使用的是哪个版本的Numba。在最新版本的Numba中,你可以调用被装饰函数的inspect_types方法,这样可以打印出哪些东西被当作Python对象来解释(因此运行得比较慢)。