关于 python-performance-optimization
用于分析和优化 Python 程序的技能,涵盖 CPU、内存和 I/O。它指导开发者从测量瓶颈入手,选择实现、数据结构、缓存或并行化方面的改进。
主要功能
- 01CPU、内存和逐行分析
- 02执行与资源指标
- 03算法和数据结构建议
- 04缓存与并行化策略
- 05数据库和内存优化
适用场景
- 01排查运行缓慢的 Python 函数
- 02降低数据处理的内存占用
- 03比较不同并发策略
- 04测量优化前后的变化
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ acaprino/ daodan --skill python-performance-optimization安装后在 Claude Code 中输入/python-performance-optimization确认已加载。
附带文件references/optimization-patterns.mdSKILL.toml
详细介绍
Python 性能优化
对 Python 代码进行性能分析、研究和优化,以提升性能——包括 CPU 性能分析、内存优化和实现最佳实践。
适用场景
- 用户反馈 Python 代码运行缓慢,或要求加快执行速度
- 对 Python 应用进行性能分析或基准测试
- 降低 CPU 时间、内存消耗或 I/O 等待
- 优化数据库查询或数据处理流水线
- 调试内存泄漏或内存占用过高的问题
- 选择并行化策略(线程、多进程、异步)
- 评估算法层面与实现层面的改进
核心概念
性能分析类型
- CPU 性能分析:找出耗时的函数(cProfile、py-spy)
- 内存性能分析:跟踪内存分配和泄漏(tracemalloc、memory_profiler)
- 逐行性能分析:按行分析代码(line_profiler)
- 调用图:直观展示函数调用关系
性能指标
- 执行时间:操作所需的时间
- 内存使用量:内存峰值和平均消耗
- CPU 利用率:处理器使用模式
- I/O 等待:花费在 I/O 操作上的时间
优化策略
- 算法层面:采用更好的算法和数据结构
- 实现层面:采用更高效的代码模式
- 并行化:多线程/多进程
- 缓存:避免重复计算
- 原生扩展:在关键路径中使用 C/Rust
快速开始
import time
import timeit
# Simple timing
start = time.time()
result = sum(range(1000000))
print(f"Execution time: {time.time() - start:.4f} seconds")
# Accurate benchmarking with timeit
execution_time = timeit.timeit("sum(range(1000000))", number=100)
print(f"Average time: {execution_time/100:.6f} seconds")
性能分析工具概览
cProfile - CPU 性能分析
python -m cProfile -o output.prof script.py
python -m pstats output.prof
line_profiler - 逐行分析
uv add --dev line-profiler # or: uv tool install line-profiler
kernprof -l -v script.py
memory_profiler - 内存使用量
uv add --dev memory-profiler
python -m memory_profiler script.py
py-spy - 生产环境性能分析
uv tool install py-spy
py-spy record -o profile.svg -- python script.py
py-spy top --pid 12345
关键优化模式
数据结构选择
- 使用 Dict/Set 进行查找:复杂度为 O(1),而列表搜索为 O(n)
- 大型数据集使用生成器:内存占用恒定,而完整列表会占用更多内存
- 在类中使用
__slots__:降低每个实例的内存占用
代码层面的优化
- 优先使用列表推导式而非循环(底层由 C 实现,速度更快)
- 优先使用
str.join()而非+=拼接 - 在热点循环中使用局部变量而非全局变量
- 在紧凑循环中内联简单操作
- 使用内置函数(由 C 实现)
缓存
- 使用
functools.lru_cache缓存开销较大的纯函数 - 使用
weakref.WeakValueDictionary创建便于垃圾回收的缓存
并行化
- multiprocessing:用于 CPU 密集型任务,实现真正的并行
- threading:用于 I/O 密集型任务,共享内存
- asyncio:用于包含大量并发操作的 I/O 密集型任务
内存优化
- 使用
tracemalloc检测内存泄漏(比较快照) - 处理文件/流时使用迭代器而非列表
- 使用
weakref缓存,以便进行垃圾回收
数据库优化
- 使用
executemany()批量执行操作,并仅提交一次 - 为频繁查询的列添加索引
- 仅选择所需的列(避免使用
SELECT *) - 使用
EXPLAIN QUERY PLAN进行分析
基准测试
from functools import wraps
import time
def benchmark(func):
"""Decorator to benchmark function execution."""
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - start
print(f"{func.__name__} took {elapsed:.6f} seconds")
return result
return wrapper
如需基于 pytest 进行基准测试:pip install pytest-benchmark
最佳实践
- 先进行性能分析,再优化——通过测量找出真正的瓶颈
- 专注于热点路径——优化运行频率最高的代码
- 使用合适的数据结构——使用 dict 进行查找,使用 set 判断成员关系
- 避免过早优化——先保证代码清晰,再进行优化
- 使用内置函数——它们由 C 实现
- 缓存开销较大的计算——使用 lru_cache
- 批量执行 I/O 操作——减少系统调用
- 对大型数据集使用生成器
- 数值运算可考虑使用 NumPy
- 分析生产环境代码——使用 py-spy 分析运行中的系统
常见陷阱
- 未进行性能分析就开始优化
- 不必要地使用全局变量
- 未使用合适的数据结构
- 创建不必要的数据副本
- 数据库未使用连接池
- 忽视算法复杂度
- 过度优化很少执行的代码路径
- 未考虑内存使用量
性能检查清单
- 对代码进行性能分析,以识别瓶颈
- 使用合适的数据结构
- 在有益的情况下实现缓存
- 优化数据库查询
- 对大型数据集使用生成器
- 对 CPU 密集型任务考虑使用多进程
- 对 I/O 密集型任务使用异步 I/O
- 尽量减少热点循环中的函数调用开销
- 检查是否存在内存泄漏
- 在优化前后进行基准测试
参考资料
references/optimization-patterns.md- 所有性能分析工具、优化模式(列表推导式、生成器、字符串拼接、字典查找、局部变量、函数调用开销)、高级优化(NumPy、lru_cache、slots、多进程、异步 I/O)、数据库优化、内存泄漏检测和基准测试工具的详细代码示例
资源
- cProfile:内置的 CPU 性能分析器
- memory_profiler:内存使用情况分析工具
- line_profiler:逐行性能分析工具
- py-spy:用于生产环境的采样分析器
- NumPy:高性能数值计算
- Cython:将 Python 编译为 C
- PyPy:带 JIT 的替代 Python 解释器
评论
支持 Markdown