30 分钟
工程化

性能优化实战:从定位到解决

掌握 Python 性能分析和优化的系统方法

  • 掌握 cProfile 性能分析
  • 学会识别性能瓶颈
  • 掌握常见优化手段
  • 理解时间复杂度和数据结构选择

优化的第一法则:测量,不要猜

过早优化是万恶之源。没测量之前,你以为的瓶颈大概率不是真瓶颈。用性能分析器找到真正慢的地方,再针对性优化。

示例代码(可运行)
💡分析器选择

cProfile 是首选,内置、零依赖。行级分析用 line_profiler。生产环境用 py-spy,采样分析,不侵入代码。内存分析用 tracemalloc。

常见优化手段

Python
# 1. 用内置函数和标准库(C实现,比Python循环快10-100倍)
# 反例
result = []
for item in items:
    if item > 0:
        result.append(item * 2)
# 正例
result = [item * 2 for item in items if item > 0]

# 2. 用正确的数据结构
# 成员检查:list 的 in 是 O(n),set/dict 的 in 是 O(1)
# 反例
if user_id in active_users_list:  # O(n)
    ...
# 正例
if user_id in active_users_set:   # O(1)
    ...

# 3. 字符串拼接用 join
# 反例
result = ""
for s in strings:
    result += s  # 每次创建新字符串,O(n^2)
# 正例
result = "".join(strings)  # O(n)

# 4. 用生成器处理大数据
# 反例:一次性加载所有行到内存
lines = [process(line) for line in open("huge_file.csv")]
# 正例:逐行处理,内存恒定
for line in open("huge_file.csv"):
    process(line)

# 5. 缓存重复计算
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2: return n
    return fibonacci(n-1) + fibonacci(n-2)

算法复杂度意识

示例代码(可运行)
🐍优化优先级

优化效果排序:算法改进(O(n2)到O(n))> 数据结构选择(list到set)> 内置函数替代循环 > 局部变量缓存 > 微优化。别花时间优化只占1%耗时的函数。

并发优化

Python
# I/O 密集(网络请求、文件读写、数据库查询)用线程或协程
import concurrent.futures

# 线程池
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    results = list(executor.map(fetch_url, urls))

# CPU 密集(数学计算、图像处理)用多进程
with concurrent.futures.ProcessPoolExecutor() as executor:
    results = list(executor.map(heavy_compute, data_chunks))

# 记住:GIL 让多线程无法并行执行 Python 字节码
# I/O 操作时 GIL 会释放,所以线程对 I/O 密集有效
# CPU 密集必须用多进程或 C 扩展
找 Bug嵌套循环是 O(n^2),加上 list 的 in 检查又是 O(n),实际接近 O(n^3)。用 set 一次遍历 O(n) 即可。
def find_duplicates(items): duplicates = [] for i in range(len(items)): for j in range(i+1, len(items)): if items[i] == items[j] and items[i] not in duplicates: duplicates.append(items[i]) return duplicates

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

底层是大量、快速、稳定的单元测试(优先覆盖纯函数与边界/异常路径),中间是少量集成测试(验证模块协作),顶端是少量端到端测试(慢且脆)。测试最大的价值是当「安全网」:有它你才敢放心重构。没测试兜底的重构,本质是在赌博。写用例先想正常、边界、异常三类。

挑战任务

性能分析与优化

简单+50 XP

用 cProfile 分析一个慢函数,找到瓶颈并优化,对比优化前后的执行时间。

性能分析与优化
3 个测试用例

课后作业

优化实战

中等+35 XP

找一个你写过的慢程序(或写一个 O(n^2) 的程序),用 cProfile 分析,优化到 O(n),写报告对比。

优化实战
1 个测试用例