整理了一份 Python 性能优化的检查清单,这七条做到了,代码跑得飞快.
很多朋友写 Python 只顾着快,结果代码跑起来慢得像蜗牛。我自己也踩过不少坑,后来慢慢总结出几条实在的经验。下面这份清单,每条都来自真实敲代码的教训。
1. 别在循环里做重复计算
这点最常见。有人写循环的时候,把固定值或者不变量放在循环里反复算。比如 len() 函数,每次循环都调用一次。明明列表长度不会变,硬是浪费 CPU 时间。改成在循环外面算一次,存成变量。还有那些嵌套循环里不变的表达式,拿出来放到外面。优化后速度能快几倍。
2. 列表推导式比 for 循环快
老手都懂。同样的逻辑,用列表推导式写,比手写 for 循环加 append 快很多。因为推导式底层用的是 C 语言级的操作,少了 Python 层面的函数调用开销。比如生成一个平方数列表,直接 [xx for x in range(1000)] 就比写四行代码快。但别过度使用,太复杂的逻辑还是拆成普通循环,可读性更重要。
3. 用 join 拼字符串,别用加号
字符串是不可变的。用加号每拼接一次,就会生成一个新字符串对象,旧对象等着被回收。尤其在大批量拼接时,内存碎片和垃圾回收会让你心疼。正确的做法是把所有片段放进列表,最后用 ''.join() 一次性合并。这改动很小,效果很明显。
4. 选择合适的数据结构
很多人查不重复元素就用列表,然后 for 循环里用 in 判断。列表的 in 操作是 O(n),数据多了就慢。换成集合或者字典,查找速度是 O(1)。判断某个值在不在里面,直接用 set。同样,频繁增删元素用列表不合适,尾插尾删还行,头部操作用 collections.deque。选对了结构,速度差好几个数量级。
5. 局部变量快于全局变量
Python 找变量的时候,局部变量在函数栈里直接取,全局变量要查字典。每次访问都慢一点点。如果函数里反复使用某个全局变量,比如常量,或者频繁调用的函数,可以 在函数内部赋值给局部变量。比如 len = len; range = range,写在函数开头。虽然不是好习惯(可读性差),但性能敏感的地方可以用。
6. 多用内建函数和标准库
别自己造轮子。Python 内建函数和标准库都是 C 语言写的,比你手写的 Python 循环快得多。比如排序用 sorted(),找最大最小用 max() min(),分组用 itertools.groupby。还有 map() filter(),虽然现在推荐列表推导式,但某些场景下它们结合 lambda 更快。总之,别人优化好的代码别浪费。
7. 能用生成器就别用列表
处理大数据时,一次性生成完整列表会吃掉大量内存。换成生成器表达式,比如把 [] 改成 (),数据是按需生产的,内存占用小。处理文件读取、日志分析这种任务,生成器 yield 关键字比直接返回列表好太多。还有 range() 在 Python3 里就是生成器,别自作聪明转成列表。
这些点都不复杂,每改动一条都花不了几分钟。但合在一起,你的代码就能从“能跑”变成“跑得快”。下次写代码的时候,对着这几条过一遍,相信我,你会看到明显的变化。