这 5 个性能优化技巧,不需要换语言,不需要上 Cython,纯 Python 就能让代码快起来。
1. 用 numpy 向量化替代循环计算
看起来没问题,但其实有更好的方式:
result = []for i in range(len(a)): result.append(a[i] * b[i] + c[i])
换成这样就优雅多了:
import numpy as npresult = np.array(a) * np.array(b) + np.array(c)
numpy 向量化操作底层是 C/Fortran,比 Python 循环快 100-1000 倍,数值计算首选。
2. 用 timeit 精确测量代码性能
搜一下 Stack Overflow,排第一的答案通常长这样:
# 凭感觉判断哪个快start = time.time()for i in range(10000): passprint(time.time() - start)
老手一般这么写:
import timeittimeit.timeit('for i in range(10000): pass', number=100)
timeit 自动禁用 GC、多次运行取最佳值,结果比 time.time() 精确得多。
测量性能的正确姿势。
3. 用 deque 替代 list 做队列
看起来没问题,但其实有更好的方式:
queue = []queue.append(item) # 入队first = queue.pop(0) # 出队 O(n)
老手一般这么写:
from collections import dequequeue = deque()queue.append(item) # 入队first = queue.popleft() # 出队 O(1)
list.pop(0) 要移动所有元素,O(n);deque 双端队列,头尾操作都是 O(1)。
数据量大时差百倍。
4. 用 pickle 高效序列化大数据
大多数人第一反应是这样的:
# 手动转 JSON 再转回来import jsondata_str = json.dumps(data)data = json.loads(data_str)
试试这个:
import pickleserialized = pickle.dumps(data)data = pickle.loads(serialized)
pickle 直接序列化 Python 对象,比 JSON 转换快 5-10 倍,但只能用于 Python 间传输,不能跨语言。
5. 用 bisect 维护有序列表
刚学 Python 的时候我这么写过:
import heapq# 每次插入后重新排序sorted_list = sorted(sorted_list + [new_item])
一行代码就能搞定:
import bisectbisect.insort(sorted_list, new_item)
bisect 用二分查找定位插入位置,O(log n) 查找 + O(n) 插入,比每次全排序快得多。
速查表
| 场景 | 别这样写 | 试试这样 |
|---|
| 数值循环计算 | for i in range(len(a)) | np.array(a) * np.array(b) |
| 测量代码性能 | time.time() | timeit.timeit() |
| 队列操作 | list.pop(0) | deque.popleft() |
| 序列化大数据 | json.dumps() | pickle.dumps() |
| 有序列表插入 | sorted(lst + [x]) | bisect.insort() |
这些看似只是语法或库函数的替换,实则是编程思维从能跑就行向优雅高效的跃迁。
当你习惯用向量运算代替裸循环、用deque管理队列、用bisect维护有序列表,代码不仅会更快,也会更清晰、更健壮。
性能优化的秘诀,往往就藏在这些日常细节里。