使用Numba提升Python性能

大家好,尽管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增添了更多的力量,并使其在所有方面都占据主导地位。

你可能感兴趣的:(python,开发语言)