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:app09.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