python性能优化需先用cprofile定位瓶颈,再针对性改进:减少重复计算、用生成器和批量操作、选对数据结构;cpu密集型可转向numpy向量化、cython或numba,同时排查i/o与环境因素。

Python代码性能优化不是靠猜,而是靠分析定位瓶颈后再针对性改进。关键在于先用工具找出慢在哪,再选择合适方法优化,避免过早优化或盲目改写。
用cProfile定位性能瓶颈
cProfile是Python内置最实用的性能分析工具,能精确到函数级别,显示每个函数的调用次数、总耗时和内部耗时。
- 在脚本开头加import cProfile,结尾加cProfile.run(‘main()’)(把main换成你的入口函数)
- 更推荐命令行方式:python -m cProfile -s cumulative your_script.py,-s cumulative按累计时间排序,一眼看到耗时最多的函数链
- 重点关注ncalls(调用次数)高且tottime(函数自身耗时)大的项——这才是真正的瓶颈,不是cumtime(含子函数)高的外层包装函数
常见可快速见效的优化方向
多数Python性能问题集中在I/O、循环、数据结构和重复计算上,以下改动成本低、收益明显:
- 减少重复计算:把循环内不变的表达式(如len(lst)、math.sqrt(2))提到循环外;用functools.lru_cache缓存纯函数结果
- 用生成器替代列表推导式:处理大数据流时,(x*2 for x in data)比[x*2 for x in data]省内存,配合itertools.islice还能提前终止
- 批量操作替代逐个调用:用str.join()代替+=拼接字符串;用list.extend()代替多次append();数据库操作尽量用executemany而非循环execute
- 选对数据结构:查存在性用set或dict(O(1)),不用list(O(n));频繁插入删除用collections.deque
必要时升级执行效率
当纯Python优化已达极限,且瓶颈确实在CPU密集型计算上,再考虑以下方案:
立即学习“Python免费学习笔记(深入)”;
- 用NumPy/pandas向量化:将循环计算转为数组操作,底层由C实现,速度提升常达10–100倍。例如用arr[arr > 0.5]代替for循环判断
- 用Cython编译热点函数:给Python函数加静态类型声明(如def func(int x, double[:] arr):),用cythonize编译成C扩展模块,适合算法核心部分
- 多进程处理CPU任务:用concurrent.futures.ProcessPoolExecutor绕过GIL限制,注意进程启动开销,适合单次运行时间长的任务
- 考虑Numba JIT:对数值计算函数加@njit装饰器,无需改代码即可获得接近C的速度,支持NumPy操作
别忽略I/O与环境因素
很多“慢”其实和Python本身无关:
- 文件读写慢?用buffering=8192或mmap;数据库慢?检查索引、连接池、是否在循环里反复查询
- 开发机性能差或资源被占满?用psutil监控内存/CPU/磁盘IO,排除环境干扰
- 用了低效库?比如用xml.etree.ElementTree解析大XML很慢,换lxml或xmltodict可能快几倍