大家好,尽管Python有很多优点,但缺乏速度对于开发人员不选择Python用于大规模、内存密集型项目有着重要影响。Python的主要缺点是它的执行速度慢,如果我们能够给Python代码一些力量,能将其执行速度提高90%。
这就是numba
的作用,它是一种高性能的即时编译器,在运行时将你的Python函数转换为优化的机器代码。它主要用于科学计算,并且与NumPy库配合使用效果最佳。
安装Numba
Numba可以直接通过pip
安装,只需要打开命令提示符并输入以下命令即可。
pip install numba
通常,使用numba的方法是通过其一系列装饰器与我们的函数一起使用。当我们调用这些装饰函数时,其中的代码将被编译成机器代码,从而实现即时编译,提高执行速度。
相关实例
本文展示一个需要很长时间才能正常执行的循环密集型函数,然后我们会使用numba
装饰它,并观察会发生什么。
以下代码返回作为参数传递的数字以内的所有质数的总和。
import time
def prime_sum(n):
s = 0
for i in range(2, n + 1):
for j in range(2, (i // 2) + 1):
if i % j == 0:
break
else:
s = s + i
return s
sta = time.time()
val = prime_sum(100000)
end = time.time()
print(val)
print("Execution Time: ", round(end - sta, 3))
454396537
Execution Time: 16.219
当在没有任何装饰器的情况下运行代码时,代码需要大约16秒才能返回结果,这是非常慢的。现在,让我们从numba
包中导入@njit
装饰器,并将其与用于我们的函数。
import time
from numba import njit
@njit
def prime_sum(n):
s = 0
for i in range(2, n + 1):
for j in range(2, (i // 2) + 1):
if i % j == 0:
break
else:
s = s + i
return s
sta = time.time()
val = prime_sum(100000)
end = time.time()
print(val)
print("Execution Time: ", round(end - sta, 3))
454396537
Execution Time: 1.047
使用@njit
装饰器后,执行时间下降到仅1秒,这意味着它比正常执行时间快了16倍。当以百分比计算时,经过numba
装饰的函数比普通函数执行速度快了93.5%,性能可能会有所不同,但差距总是非常大的。
@njit
装饰器的行为本质上是编译已装饰的函数,以便它完全在没有Python解释器的情况下运行,这是将代码引导到更好性能的推荐和最佳方法。
结论
除了@njit
之外,Numba还有很多其他装饰器,可以在不同的情况下使用。但这不是在本文中想讨论的内容,最适合使用numba相关装饰器的地方是需要大量使用数学、NumPy或循环的程序。
Numba不适合在它不理解代码的地方使用,最好的例子就是pandas
,这是一个numba
无法理解其中函数的库,这种误用会导致numba
装饰器增加额外的编译时间,从而导致执行更加缓慢。
Numba在快速编译方面是一款改变游戏规则的工具,它为Python增添了更多的力量,并使其在所有方面都占据主导地位。