Python 性能优化:cProfile、line_profiler、memory_profiler、Numba 实战

小飞兽 Python 12 次阅读 2026-07-24

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