Python 性能优化:cProfile、line_profiler、memory_profiler、Numba 实战
Introduction
Python 慢是公认的问题。本文从性能分析工具讲起,用 cProfile/line_profiler 定位瓶颈、memory_profiler 分析内存、Numba 加速计算、缓存装饰器减少重复计算,附实战案例。
---
性能分析(cProfile)
import cProfile, pstats, io
def slow_function():
total = 0
for i in range(1000000):
total += i
return total
pr = cProfile.Profile()
pr.enable()
slow_function()
pr.disable()
s = io.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
ps.print_stats(20) # 前20行
print(s.getvalue())
line_profiler(逐行分析)
pip install line_profiler
# mymodule.py
@profile # 装饰器,由 kernprof 运行
def compute():
result = []
for i in range(10000):
result.append(i ** 2)
return sum(result)
kernprof -l -v mymodule.py
memory_profiler(内存分析)
pip install memory_profiler
@profile
def memory_heavy():
data = [i ** 2 for i in range(1000000)]
return sum(data)
# 命令行运行
# python -m memory_profiler myscript.py
Numba 加速( JIT 编译)
pip install numba
from numba import jit
import time
@jit(nopython=True)
def matrix_multiply(n):
a = [[i * j for j in range(n)] for i in range(n)]
return a
start = time.time()
result = matrix_multiply(500)
print(f"Numba: {time.time()-start:.3f}秒")
缓存装饰器
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2: return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100)) # 瞬间完成(缓存加速)
常见问题
Q1: Python 性能优化有什么通用原则?先 profile 定位瓶颈(不要猜),I/O 密集用 asyncio,计算密集用 Numba/Cython/多进程,避免全局解释器锁在 CPU 密集场景。
Q2: 列表推导式 vs 生成器怎么选?列表推导式一次生成所有元素,适合小规模数据。生成器(带 yield)惰性求值,适合大数据或流式处理。
Q3: 多线程能加速 Python 吗?CPU 密集不不行(受 GIL 限制),用 multiprocessing。I/O 密集可以用 threading 或 asyncio。
延伸阅读
- Cython 加速 Python
- 多进程并行计算
- Python 性能 cookbook
---
作者:小马 | 绍大技术网 shaoda.net