提高python运行速度的几个技巧
使用内置数据类型
内置数据类型非常快,尤其是与我们自定义的类型相比。
这主要是因为内置的数据类型是由 C 实现的,而在 Python 中写的代码运行速度实在无法与之相比。
尽量使用内置函数,去掉属性访问
import math import time def func(): lst = [] for i in range(1, 10000000): lst.append(math.sqrt(i)) # 直接调用 sqrt return lst start = time.time() lst = func() end = time.time() print(end-start)
运行时间:4.470336198806763秒
from math import sqrt # 直接引用特定函数或属性 import time def func(): lst = [] for i in range(1, 10000000): lst.append(sqrt(i)) # 直接调用 sqrt return lst start = time.time() lst = func() end = time.time() print(end-start)
运行时间:3.7398300170898438秒
因为在进行属性访问的时候啊,会调用这个对象的 __getattribute__ 或者 __getattr__ 方法,造成了额外的开销,所以导致速度变慢。
使用生成器,例如列表推导式
from math import sqrt import time def func(): # for 循环改为列表推导式 lst = [sqrt(i) for i in range(1, 10000000)] return lst start = time.time() lst = func() end = time.time() print(end-start)
列表推导式内的迭代是 C 实现的,所以效率更高。
使用 lru_cache 缓存或持久化
参考:https://www.cnblogs.com/-wenli/p/11441142.html
尽量使用本地变量
程序运行速度与在每个作用域中查找变量有关。
实际上,访问不同作用域的变量速度也是不同的,比如在函数内访问本地变量(最快),访问类层面变量(如 self.name,比较慢),以及全局变量,比如例子中导入的函数 time.time (这种最慢)。
使用numba
介绍
Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时,它被编译为机器代码“及时”执行,并且您的全部或部分代码随后可以以本机机器代码速度运行!
什么样的代码会被加速?
代码中的数学运算、NumPy或者循环,兼容常用的科学计算包,如numpy、cmath等。
怎么使用?
只需要添加两行代码
导入及使用语法糖
import numba as nb import numpy as np import time @nb.jit(nopython=True) def nb_sum(): arr = [] for i in range(10000000): arr.append(i) def py_sum(): arr = [] for i in range(10000000): arr.append(i) start = time.time() nb_sum() end = time.time() print("numba加速的函数运行时间: %s" % (end - start)) start = time.time() py_sum() end = time.time() print("没加速的函数运行时间: %s" % (end - start))
工作原理
Numba读取装饰函数的Python字节码,并将其与有关函数输入参数类型的信息相结合。
它分析并优化您的代码,最后使用LLVM编译器库生成函数的机器代码版本,根据您的CPU功能量身定制。
每次调用函数时都会使用此编译版本。