很多人对Python有一个误解:Python就是慢。其实,这个说法对了一半。
Python确实比C、Go慢,但它易学易用、库丰富、生态强大。关键是——你得知道怎么优化它。
今天分享一套实用的Python性能优化方法,从简单到复杂,手把手教你让代码跑得更快。
第一层:代码层面的优化
1. 用列表推导式代替循环
不要这样写:
result = [] for i in range(1000): result.append(i * 2)
要这样写:
result = [i * 2 for i in range(1000)]
列表推导式比循环快一倍不止。
2. 避免频繁的字符串拼接
不要这样:
s = "" for i in range(1000): s += str(i)
要这样:
parts = [] for i in range(1000): parts.append(str(i)) s = "".join(parts)
字符串拼接会产生大量中间对象,join()只创建一个。
3. 用局部变量代替全局变量
Python访问局部变量比全局变量快。
把:
def calc(): return math.sqrt(x) + math.cos(x)
改成:
def calc(): from math import sqrt, cos return sqrt(x) + cos(x)
4. 少用点号访问
不要这样:
for item in items: result.append(item.name.upper())
要这样:
append = result.append upper = str.upper for item in items: append(item.name.upper())
听起来奇怪,但确实能快一点。
第二层:数据结构优化
1. 用set代替list做查找
如果你的代码经常做"是否存在"检查,用set代替list:
# 慢 if item in big_list: # O(n) # 快 if item in big_set: # O(1)
2. 用dict代替list做计数
统计频率时:
# 慢 counts = [] for item in items: found = False for c in counts: if c[0] == item: c[1] += 1 found = True break if not found: counts.append([item, 1]) # 快 from collections import Counter counts = Counter(items)
3. 合理选择数据结构
第三层:使用内置工具
1. 用map和filter代替循环
# 比手动循环快 result = map(lambda x: x * 2, items) filtered = filter(lambda x: x > 0, items)
2. 用itertools处理大数据
处理超大数据集时,用迭代器而不是一次性加载:
from itertools import islice # 只处理前1000个,但不用加载全部数据 for item in islice(large_generator(), 1000): process(item)
3. 用生成器节省内存
不要:
def get_items(): return [i for i in range(1000000)]
要:
def get_items(): for i in range(1000000): yield i
生成器是"懒加载",用到才计算,不占内存。
第四层:借助库的力量
1. NumPy:向量化运算
别用Python循环做数值计算:
import numpy as np # 慢 result = [] for i in range(10000): result.append(i * 2.5 + 1) # 快 arr = np.arange(10000) result = arr * 2.5 + 1
NumPy底层是C写的,快几十倍。
2. Pandas:处理表格数据
不要用Python循环处理CSV:
import pandas as pd df = pd.read_csv('data.csv') df['new_col'] = df['col1'] * 2 # 向量化操作
3. Cython/Numba:编译加速
写好的Python代码,加上两行就能变快:
from numba import jit @jit def fast_function(x): # 你的Python代码 return result
Numba会把Python代码编译成机器码。
第五层:找准瓶颈再优化
1. 用profiler找到慢的地方
不要乱优化,先找到瓶颈:
import cProfile cProfile.run('your_function()')
或者用line_profiler逐行分析:
@profile def slow_function(): # 你的代码
2. 记住优化法则
写在最后
Python慢不慢,关键看你会不会用。
上面的方法,从简单到复杂,每个层级都能带来显著提升。
我的建议是:
- 先写干净的代码
- 遇到性能问题
- 从简单方法开始试
大部分场景,用到第三层就够了。

真的遇到性能瓶颈,再考虑第五层。
