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、循环、数据结构和重复计算上,以下改动成本低、收益明显:
采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压
- 减少重复计算:把循环内不变的表达式(如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可能快几倍










