用途
本技能面向 Python 库的性能优化,强调以测量驱动的流程来定位并解决性能瓶颈。它不属于一次性代码生成,而是提供一套可复用的分析、测试与优化方法,配套提供更深入的文档(PROFILING.md 讲高级分析技巧,BENCHMARKS.md 讲 CI 基准回归测试)。
主要能力
- 性能分析:使用 PyInstrument 做统计式分析并输出可读性较强的结果;使用内置 cProfile 查看累计耗时。
- 内存分析:使用 memray 运行脚本并生成火焰图;使用 tracemalloc 抓取快照并按行号输出前 10 个内存占用点。
- 基准测试:使用 pytest-benchmark 编写基准测试,可只跑基准(--benchmark-only),也可进行对比(--benchmark-compare)。
- 常见优化手法:用 set 做成员判断(O(1) 对 O(n));用 collections.deque 做队列操作,popleft 为 O(1),而 list.pop(0) 为 O(n);用生成器处理大数据;用 functools.lru_cache 缓存昂贵计算;用 "".join(...) 拼接字符串而非在循环中 +=。
- 复杂度参考:list 查找 O(n)、插入 O(1)、删除 O(n);set 与 dict 查找、插入、删除均为 O(1)。
使用方式
命令行示例:
python -m pyinstrument script.pypython -m cProfile -s cumulative script.pyuv add --dev memray,然后memray run script.py,再memray flamegraph memray-*.bin代码示例(PyInstrument):
from pyinstrument import Profiler
profiler = Profiler()
profiler.start()
result = my_function()
profiler.stop()
print(profiler.output_text(unicode=True, color=True))
内存分析示例(tracemalloc):
import tracemalloc
tracemalloc.start()
# ... code ...
snapshot = tracemalloc.take_snapshot()
for stat in snapshot.statistics('lineno')[:10]:
print(stat)
基准测试示例(pytest-benchmark):
def test_encode_benchmark(benchmark):
result = benchmark(encode, 37.7749, -122.4194)
assert len(result) == 12
运行命令:pytest tests/ --benchmark-only、pytest tests/ --benchmark-compare
适用场景
适用于需要提升 Python 库运行效率或内存占用、并希望用数据验证优化效果的开发和测试流程,尤其是需要把基准测试纳入持续集成以防性能回归的场景。
限制
资料未说明该技能支持的 Python 版本、依赖版本范围及具体运行环境要求,也未提供各工具的性能开销或适用边界,这些内容暂未提供。
优化清单
优化前:确认确实存在问题;用分析定位实际瓶颈;建立基线测量。 过程中:先做算法改进,再改数据结构,然后才动实现细节;每次改动后重新测量。 优化后:加入基准测试防止回归;验证功能正确性未变;记录此次优化的原因。