JIT(just-in-time compilation)是动态编译的一种形式,是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态直译。静态编译的程序在执行前全部被翻译为机器码,而直译执行的则是一句一句边运行边翻译。即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。
有时间的童鞋可以多研究一下编译语言与动态语言在编译运行上面有什么的异同。
Numba是一个库,可以在运行时将Python代码编译为本地机器指令,是使用LLVM编译器完成的,利用了JIT的技术,使得代码在一些多次运行的,大型的运算中运行效率有较大的提高
pip install numba
@jit
from numba import jit
from numpy import arange
# jit decorator tells Numba to compile this function.
# The argument types will be inferred by Numba when function is called.
@jit
def sum2d(arr):
M, N = arr.shape
result = 0.0
for i in range(M):
for j in range(N):
result += arr[i,j]
return result
a = arange(9).reshape(3,3)
print(sum2d(a))
# 以上是官方的代码,但是本人在运行的过程中发现反而更加慢了,查了资料发现是numba在执行前需要预热资源准备的缘故,所以修改为
# a = arange(9999999).reshape(3333333,3) 运行效果就非常明显了
在测试过程中,虽然numba在一些大型的反复的科学运算中效率得到提高,但是在TensorFlow上还是没有支持此库的
什么是即时编译器JIT
numba官网
Python · numba 的基本应用
用numba为python写高性能C扩展