Python 开发手册PYTHON

CHAPTER 09体验底线 · PERFORMANCE

性能与
部署

慢与难部署会毁掉体验。本章讲透剖析定位热点、向量化与算法优化、C 扩展、WSGI/ASGI 服务、容器化与 CI/CD。

开始阅读难度高阶约2.5小时
09.1

先测再优化

凭直觉优化常错。先用剖析工具找到真实热点(二八定律:20% 代码占 80% 时间),把力气花在刀刃上。

度量文化

给关键路径加基准测试(pytest-benchmark),防止优化后回归。优化前后都要有数据对比。

09.2

cProfile 剖析

cProfile 统计函数调用次数与耗时,pstats 排序找最耗时函数。

import cProfile, pstats
prof = cProfile.Profile()
prof.enable(); run_pipeline(); prof.disable()
stats = pstats.Stats(prof).sort_stats("cumtime")
stats.print_stats(10)
09.3

向量化

把 Python 循环下沉到 C 层:NumPy 向量化、内置函数(sum/map)通常远快于手写循环。

# 慢:Python 循环
s = sum([x*x for x in range(10**6)])
# 快:NumPy 向量化(C 实现)
import numpy as np
s = int((np.arange(10**6)**2).sum())
09.4

算法与数据结构

用 set/dict 把 O(n) 查找降到 O(1);避免重复计算(缓存/lru_cache);选对算法复杂度。

from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n): return n if n < 2 else fib(n-1) + fib(n-2)
09.5

C 扩展提速

热点可用 Cython、Numba(JIT)或调用 C/Rust 扩展;但优先算法与向量化,扩展是最后手段。

扩展有成本

写 C 扩展增加维护与构建复杂度,确认热点值得再上,别过早优化。

09.6

服务部署

Web 服务用 gunicorn/uvicorn(ASGI 为多)托管;多 worker 利用多核,注意静态资源与反向代理。

pip install uvicorn gunicorn
gunicorn -k uvicorn.workers.UvicornWorker -w 4 main:app
09.7

容器与 CI

用 Dockerfile 固化运行环境,CI 自动跑测试+构建+推送镜像,部署可重复且可回滚。

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]
09.8

常见陷阱

为什么加了多进程还是慢?

可能瓶颈在单点(DB/锁),或 worker 数超过核数反而争抢。先剖析,再决定加并发还是优化慢查询。

容器里内存爆了?

多 worker × 各自内存可能超配额。按可用内存设 worker 数,或用 --max-requests 定期回收防内存泄漏累积。

09.9

实战练习

延伸资源