关于 python-performance-optimization
面向 Python 开发者的性能优化指南,强调先测量和定位瓶颈,再通过算法、数据结构及加速技术改善运行时间或内存占用。
主要功能
- 01优化前先分析性能
- 02改进算法与数据结构
- 03用生成器降低内存占用
- 04缓存重复计算
- 05采用 NumPy、Numba 或多进程
适用场景
- 01排查生产代码运行缓慢
- 02降低数据流水线的内存占用
- 03缩短 API 响应或批处理时间
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ nickcrew/ claude-cortex --skill python-performance-optimization安装后在 Claude Code 中输入/python-performance-optimization确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/acceleration.mdalgorithms.mdmemory.mdprofiling.mdstring-io.md详细介绍
Python 性能优化
通过系统分析、算法改进、高效数据结构和加速技术,为 Python 应用提供性能分析、优化和提速方面的专家指导。
适用场景
- 代码运行速度无法满足生产环境要求
- CPU 使用率或内存消耗过高
- 需要缩短 API 响应时间或批处理耗时
- 应用在负载下无法扩展
- 优化数据处理流水线或科学计算
- 通过提升效率降低云基础设施成本
- 测量性能瓶颈后进行基于性能分析的优化
核心概念
黄金法则:先进行性能分析,再做优化。80% 的执行时间花在 20% 的代码上。
优化层级(按优先级排序):
- 算法复杂度 - O(n²) → O(n log n),可带来数量级的提升
- 数据结构选择 - 查找时将 List 换成 Set(速度提升 10,000 倍)
- 语言特性 - 推导式、内置函数、生成器
- 缓存 - 对重复计算进行记忆化
- 编译扩展 - 使用 NumPy、Numba、Cython 优化热点路径
- 并行处理 - 对 CPU 密集型工作使用多进程
关键原则:算法改进始终胜过微优化。
快速参考
针对特定优化领域加载详细指南:
| 任务 | 加载参考文档 |
|---|---|
| 分析代码并查找瓶颈 | skills/python-performance-optimization/references/profiling.md |
| 算法和数据结构优化 | skills/python-performance-optimization/references/algorithms.md |
| 内存优化和生成器 | skills/python-performance-optimization/references/memory.md |
| 字符串拼接和文件 I/O | skills/python-performance-optimization/references/string-io.md |
| NumPy、Numba、Cython、多进程 | skills/python-performance-optimization/references/acceleration.md |
优化工作流
阶段 1:测量
- 使用 cProfile 分析性能 - 找出运行缓慢的函数
- 对热点路径进行行级性能分析 - 找出具体的慢行
- 分析内存使用情况 - 检查内存瓶颈
- 建立基准测试 - 记录当前性能
阶段 2:分析
- 检查算法复杂度 - 是否为 O(n²) 或更差?
- 评估数据结构 - 是否在查找时使用了列表?
- 找出重复工作 - 能否缓存结果?
- 查找 I/O 瓶颈 - 数据库查询、文件操作
阶段 3:优化
- 先改进算法 - 影响最大
- 使用合适的数据结构 - 使用 Set/dict 实现 O(1) 查找
- 应用缓存 - 对耗时函数使用
@lru_cache - 使用生成器 - 适用于大型数据集
- 利用 NumPy/Numba - 适用于数值代码
- 并行处理 - 对 CPU 密集型任务使用多进程
阶段 4:验证
- 重新进行性能分析 - 验证改进效果
- 进行基准测试 - 定量测量提速效果
- 测试正确性 - 确保优化没有破坏功能
- 编写文档 - 说明进行优化的原因
常见优化模式
模式 1:查找时将 List 换成 Set
# Slow: O(n) lookup
if item in large_list: # Bad
# Fast: O(1) lookup
if item in large_set: # Good
模式 2:使用推导式
# Slower
result = []
for i in range(n):
result.append(i * 2)
# Faster (35% speedup)
result = [i * 2 for i in range(n)]
模式 3:缓存耗时计算
from functools import lru_cache
@lru_cache(maxsize=None)
def expensive_function(n):
# Result cached automatically
return complex_calculation(n)
模式 4:对大型数据使用生成器
# Memory inefficient
def read_file(path):
return [line for line in open(path)] # Loads entire file
# Memory efficient
def read_file(path):
for line in open(path): # Streams line by line
yield line.strip()
模式 5:使用 NumPy 进行向量化
# Pure Python: ~500ms
result = sum(i**2 for i in range(1000000))
# NumPy: ~5ms (100x faster)
import numpy as np
result = np.sum(np.arange(1000000)**2)
应避免的常见错误
- 未进行性能分析就开始优化 - 你会优化错代码
- 使用列表进行成员测试 - 改用 Set/dict
- 在循环中拼接字符串 - 使用
"".join()或StringIO - 将整个文件加载到内存中 - 使用生成器
- N+1 数据库查询 - 使用 JOIN 或批量查询
- 忽略内置函数 - 它们经过 C 语言优化,速度很快
- 过早优化 - 优先关注算法改进
- 不进行基准测试 - 始终定量测量改进效果
决策树
从这里开始:使用 cProfile 进行性能分析,找出瓶颈
热点路径是算法吗?
- 是 → 检查复杂度、改进算法、使用更合适的数据结构
- 否 → 继续
热点路径是计算吗?
- 数值循环 → 使用 NumPy 或 Numba
- CPU 密集型 → 使用多进程
- 性能已经足够快 → 完成
热点路径是内存吗?
- 大型数据 → 使用生成器、流式处理
- 大量对象 → 使用
__slots__、对象池 - 需要缓存 → 使用
@lru_cache或自定义缓存
热点路径是 I/O 吗?
- 数据库 → 批量查询、索引、连接池
- 文件 → 缓冲、流式处理
- 网络 → 异步 I/O、批量请求
最佳实践
- 先进行性能分析,再优化 - 测量并找出真正的瓶颈
- 优先优化算法 - O(n²) → O(n) 的效果胜过微优化
- 使用恰当的数据结构 - 查找时使用 Set/dict,而不是列表
- 善用内置功能 - 由 C 实现的内置功能比纯 Python 更快
- 避免过早优化 - 优化性能分析所发现的热点路径
- 处理大型数据时使用生成器 - 通过惰性求值减少内存使用
- 批量执行操作 - 尽量减少系统调用和网络请求的开销
- 缓存开销大的计算 - 使用
@lru_cache或自定义缓存 - 考虑使用 NumPy/Numba - 对数值代码进行向量化和 JIT 编译
- 并行处理 CPU 密集型任务 - 使用多进程来利用所有核心
资源
- Python 性能:https://wiki.python.org/moin/PythonSpeed
- cProfile:https://docs.python.org/3/library/profile.html
- NumPy:https://numpy.org/doc/stable/user/absolute_beginners.html
- Numba:https://numba.pydata.org/
- Cython:https://cython.readthedocs.io/
- High Performance Python(Gorelick 和 Ozsvald 所著)
评论
支持 Markdown