Python 代码加速运行的 8 种实用技巧
Python 是一种解释型脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在天然差距。然而,在实际开发中,许多 Python 程序的性能瓶颈并非不可逾越。通过理解解释器机制并应用特定的优化技巧,可以显著提升代码运行速度。本文整理了八种经过验证的 Python 代码加速技巧。
Python 脚本语言在效率上相比编译型语言存在不足,但通过合理优化可显著提升性能。本文整理了八种加速技巧:避免全局变量以提升查找速度;减少模块及类属性访问以降低字典操作开销;移除不必要的抽象层如装饰器;避免无意义的数据复制与中间变量;利用条件短路特性;优先使用 for 循环及内置函数替代显式循环;借助 numba.jit 进行 JIT 编译;选择合适数据结构如 deque 或 heapq。遵循不过早优化原则,聚焦热点代码路径,可实现显著的性能提升。

Python 是一种解释型脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在天然差距。然而,在实际开发中,许多 Python 程序的性能瓶颈并非不可逾越。通过理解解释器机制并应用特定的优化技巧,可以显著提升代码运行速度。本文整理了八种经过验证的 Python 代码加速技巧。
在深入具体的优化细节之前,必须遵循科学的优化原则:
Python 的变量查找遵循 LEGB 规则(Local, Enclosing, Global, Built-in)。访问全局变量的开销通常大于局部变量,因为解释器需要在全局作用域字典中进行查找。
# 不推荐写法:使用全局变量
import math
size = 10000
for x in range(size):
for y in range(size):
z = math.sqrt(x) + math.sqrt(y)
将脚本语句放入函数中,变量变为局部变量,查找速度更快,通常可带来 15% - 30% 的速度提升。
# 推荐写法:封装为函数
import math
def main():
size = 10000
for x in range(size):
for y in range(size):
z = math.sqrt(x) + math.sqrt(y)
if __name__ == "__main__":
main()
每次使用 . 操作符访问属性时,会触发 __getattribute__ 或 getattr 方法,这些方法涉及字典操作,带来额外开销。减少属性访问频率是重要的优化手段。
# 不推荐写法:频繁调用 math.sqrt
import math
def computeSqrt(size: int):
result = []
for i in range(size):
result.append(math.sqrt(i))
return result
通过 from ... import ... 语句将函数导入为局部变量,消除属性访问。
# 第一次优化:导入函数
from math import sqrt
def computeSqrt(size: int):
result = []
for i in range(size):
result.append(sqrt(i))
return result
进一步,将列表的 append 方法也赋值给局部变量,彻底消除循环内的属性查找。
# 推荐写法:缓存常用方法
import math
def computeSqrt(size: int):
result = []
append = result.append
sqrt = math.sqrt
for i in range(size):
append(sqrt(i))
return result
在类的方法中,访问 self._value 同样比访问局部变量慢。对于高频访问的实例属性,可将其缓存到局部变量中。
# 推荐写法:缓存实例属性
import math
from typing import List
class DemoClass:
def __init__(self, value: int):
self._value = value
def computeSqrt(self, size: int) -> List[float]:
result = []
append = result.append
sqrt = math.sqrt
value = self._value # 缓存到局部变量
for _ in range(size):
append(sqrt(value))
return result
装饰器、属性访问器(property)、描述器等抽象层虽然提升了代码的可读性和安全性,但也会增加运行时开销。在性能敏感的场景下,应简化结构。
# 不推荐写法:使用 property 包装简单属性
class DemoClass:
def __init__(self, value: int):
self.value = value
@property
def value(self) -> int:
return self._value
@value.setter
def value(self, x: int):
self._value = x
直接使用普通属性通常能获得更好的性能。
# 推荐写法:直接访问属性
class DemoClass:
def __init__(self, value: int):
self.value = value
创建中间数据结构会增加内存分配和拷贝开销。尽量直接在迭代过程中处理数据。
# 不推荐写法:创建不必要的中间列表
def main():
size = 10000
for _ in range(size):
value = range(size)
value_list = [x for x in value]
square_list = [x * x for x in value_list]
# 推荐写法:直接推导
import time
def main():
size = 10000
for _ in range(size):
value = range(size)
square_list = [x * x for x in value]
Python 支持元组解包,可以直接交换变量,无需临时变量。
# 推荐写法:元组解包
a, b = b, a
字符串是不可变对象。使用 + 拼接时,每次操作都会创建新对象并复制内容。join() 会预先计算总长度,一次性分配内存。
# 不推荐写法:循环拼接
result = ''
for s in string_list:
result += s
# 推荐写法:使用 join
result = ''.join(string_list)
在布尔表达式中,Python 会按顺序求值。对于 and,若前一项为假则不再计算后一项;对于 or,若前一项为真则不再计算后一项。合理排序条件可减少计算量。
# 推荐写法:先判断高概率条件
if str_i[-1] == '.' and str_i in abbreviations:
result += str_i
Python 的 for 循环基于迭代器协议实现,底层由 C 优化,通常比手动管理索引的 while 循环更快。
# 推荐写法:使用 for
for i in range(size):
sum_ += i
利用内置函数(如 sum, map, filter)通常能发挥 C 扩展的优势。
# 推荐写法:内置函数
return sum(range(size))
将不随内层循环变化的计算提取到外层循环之外。
# 推荐写法:循环外提
for x in range(size):
sqrt_x = sqrt(x)
for y in range(size):
z = sqrt_x + sqrt(y)
Numba 是一个 JIT 编译器,可以将 Python 数值计算函数编译为机器码执行,大幅提升数值密集型代码的性能。
import numba
@numba.jit(nopython=True)
def computeSum(size: float) -> int:
total = 0
for i in range(int(size)):
total += i
return total
Python 内置数据结构底层多为 C 实现,效率较高。根据场景选择正确的结构至关重要。
list 适合随机访问,但在两端频繁插入删除效率低。collections.deque 支持 O(1) 复杂度的两端操作。bisect 模块维护有序列表并进行二分查找。heapq 模块构建堆,使获取极值的时间复杂度降为 O(1)。性能优化是一个系统工程,需要结合具体场景权衡。建议遵循以下流程:
通过合理运用这些技巧,可以在不改变业务逻辑的前提下,显著提升 Python 程序的运行效率。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online