mcpField
P
python-performance-optimization

python-performance-optimization

github.com/acaprino开发940 次安装1 天前更新
代码仓库

关于 python-performance-optimization

用于分析和优化 Python 程序的技能,涵盖 CPU、内存和 I/O。它指导开发者从测量瓶颈入手,选择实现、数据结构、缓存或并行化方面的改进。

主要功能

  1. 01CPU、内存和逐行分析
  2. 02执行与资源指标
  3. 03算法和数据结构建议
  4. 04缓存与并行化策略
  5. 05数据库和内存优化

适用场景

  1. 01排查运行缓慢的 Python 函数
  2. 02降低数据处理的内存占用
  3. 03比较不同并发策略
  4. 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

最佳实践

  1. 先进行性能分析,再优化——通过测量找出真正的瓶颈
  2. 专注于热点路径——优化运行频率最高的代码
  3. 使用合适的数据结构——使用 dict 进行查找,使用 set 判断成员关系
  4. 避免过早优化——先保证代码清晰,再进行优化
  5. 使用内置函数——它们由 C 实现
  6. 缓存开销较大的计算——使用 lru_cache
  7. 批量执行 I/O 操作——减少系统调用
  8. 对大型数据集使用生成器
  9. 数值运算可考虑使用 NumPy
  10. 分析生产环境代码——使用 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