优化Python性能需先用cProfile或line_profiler定位瓶颈,减少对象创建与内存拷贝,善用集合、内置函数及C扩展,IO密集用异步/线程,CPU密集用多进程。

定位性能瓶颈:从测量开始
不测量就优化,等于蒙眼开车。Python里最直接的工具是cProfile,它能告诉你哪一行、哪个函数耗时最多。运行python -m cProfile -s cumulative your_script.py,按累计时间排序,重点关注ncalls高且tottime大的函数。
更轻量的选择是line_profiler,用@profile装饰目标函数后执行kernprof -l -v script.py,可精确到每一行的执行次数和耗时。对I/O密集型任务,别忘了检查time.sleep、文件读写、网络请求是否成了隐形拖累——这些在CPU时间里不显眼,却让整体变慢。
减少对象创建与内存开销
频繁创建短生命周期对象(如字符串拼接、列表推导中嵌套生成器)会触发大量GC,拖慢速度。避免用+拼接多个字符串,改用''.join(list_of_strings);不用[x for x in range(N)]构造大列表,优先用range(N)本身(它是惰性迭代器)或生成器表达式。
留意隐式拷贝:切片lst[1000:2000]会复制元素,而itertools.islice(lst, 1000, 2000)只做视图;传参时尽量传引用(不可变对象除外),避免函数内重复copy.deepcopy()。
立即学习“Python免费学习笔记(深入)”;
- 用
__slots__限制实例属性,节省内存并加速属性访问 - 对固定结构数据,考虑
collections.namedtuple或typing.NamedTuple替代普通class - 大数组运算交给
numpy,它把循环压进C层,避免Python级for循环
算法与数据结构:换一个思路快十倍
很多慢不是因为代码写得“糙”,而是选错了抽象。比如判断元素是否在容器中:if x in list是O(n),换成set就是O(1);统计词频用collections.Counter比手写字典计数更简洁高效;需要频繁插入/删除中间位置?list不合适,试试collections.deque。
递归深了容易栈溢出且慢,能转成迭代就转。例如树遍历、DFS/BFS,用显式栈或队列常比递归清晰又快。还有,别忽视内置函数——sum()比手动for累加快,all()/any()带短路逻辑,比写循环更安全高效。
合理使用C扩展与并发加速
纯Python卡在计算密集型任务?先看有没有现成C加速模块:regex比re快,ujson比json解析快2–5倍,cython可把关键函数编译成C,几行注解就能提速数倍。
IO密集型任务用asyncio或concurrent.futures.ThreadPoolExecutor;CPU密集型则上multiprocessing或concurrent.futures.ProcessPoolExecutor。注意GIL限制——多线程无法真正并行CPU任务,但多进程可以。启动进程有开销,适合单次耗时>0.1秒的任务。
不复杂但容易忽略。











