1. __slots__
class Person:
__slots__ = ['name', 'age']
为什么使用这个技巧:
- 减少内存使用:Python 通常使用
__dict__
来存储对象属性,这会消耗更多资源且速度较慢。 - 更快的属性访问:使用
__slots__
,Python 使用静态数组,从而消除了查找键的开销。 - 在创建数百万个实例时非常有用:数据处理、ETL、数据科学。
2. 生成器表达式 ((x for x in ...)
)
sum(x**2 for x in range(1_000_000))
为什么使用这个技巧:
- 避免创建临时列表:
sum([x**2 for x in ...])
首先在内存中创建一个列表,然后应用求和函数。 - 减少内存使用: 在创建大型数据集时非常有用。
3. 使用 functools.lru_cache
进行记忆化
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
return fib(n-1) + fib(n-2) if n > 1 else n
为什么使用这个技巧:
- 避免重复计算结果: 将相同参数的值存储在缓存中。
- 纯函数(相同输入 → 相同输出):非常适合递归算法,如斐波那契数列、树中的搜索。
4. 使用NumPy进行向量化
import numpy as np
arr = np.array([1, 2, 3])
result = arr * 2
为什么使用这个技巧:
- 在C中优化操作: NumPy在连续的内存块(C中的数组)中执行操作,而不使用Python中的循环。
- 绕过GIL: 操作直接应用于数据,而不使用Python循环。
5. Cython编译
# example.pyx (Cython)
def sum(int a, int b):
return a + b
为什么使用这个技巧:
- 将 Python 代码转换为 C: Cython 将代码编译为本地 C 扩展。
- 静态类型提高效率: 声明类型(
int
,float
),避免 Python 的动态类型。 - 更快的数学计算: 数学运算速度提高 100 倍。
6. collections.defaultdict 用于字典
from collections import defaultdict
count = defaultdict(int) # 默认初始化值
count["word"] += 1
为什么使用这个技巧:
- 避免字典中键的存在性检查: 在普通字典中,你需要先检查键是否存在。
defaultdict
会为你处理这个问题。 - 减少对函数的调用:比
dict.setdefault()
或try/except KeyError
更高效。
7. 使用 str.join()
进行连接
"".join(str_list)
为什么使用这个技巧:
- 字符串是不可变的:在Python中,每次使用
+=
都会创建一个新的字符串对象(这个过程的时间复杂度是O(n²))。 join()
预分配内存:在一次操作中连接每个项目(这个过程的时间复杂度是O(n))。
性能提升
技巧 | 提升 | 理想使用场景 |
---|---|---|
__slots__ |
快约20-30% | 处理多个对象实例 |
生成器 | 2-5倍(在内存中) | 大数据处理 |
lru_cache |
10-100倍(速度) | 递归调用的函数 |
NumPy | 10-1000倍 | 矩阵运算 |
Cython | 10-100倍 | 重数学循环 |
defaultdict |
约2倍 | 计数 |
频率 | ||
str.join() |
10-100倍(大N) | 大规模文本连接 |
按Python版本的兼容性
1. __slots__
- 兼容版本: Python 2.7 和所有 Python 3.x 版本(3.0+)。
- 详细信息: 在所有现代版本中表现一致。
2. 生成器表达式 ((x for x in ...)
)
- 兼容版本: Python 2.4+(但在 Python 3.x 中进行了优化)。
- Python 3 的改进:
- 在 Python 3 中,生成器的内存效率更高。
range()
在 Python 3 中已经是一个生成器(在 Python 2 中,它是一个列表)。
3. functools.lru_cache
- 兼容版本:
- Python 3.2+(包含在标准库中)。
- Python 2.7 需要
pip install functools32
。
- Python 3.8+ 的变化:
- 新增
user_function
参数以便于自定义。
- 新增
4. 使用 NumPy 进行向量化
- 兼容版本: Python 2.7 和 Python 3.x(Python 3.7+ 需要 NumPy ≥ 1.16)。
- 推荐: 对于 Python 3.9+,使用 NumPy ≥ 1.19(更好的支持)。
5. Cython
- 兼容版本:
- Python 2.7(支持到 Cython 0.29.x)。
- Python 3.x(对于 Python 3.11+ 需要 Cython ≥ 3.0)。
- 重要提示:
- Python 3.11+ 对解释器进行了优化,在某些情况下减少了原生 Python 和 Cython 之间的性能差距。
6. collections.defaultdict
- 兼容版本: Python 2.5+ 和所有 Python 3.x 版本。
- 版本间没有显著变化。
7. 使用 str.join()
进行字符串连接
- 兼容版本: Python 2.x 和 3.x。
- 在 Python 3.9+ 中的优化:
- 字符串处理的内部改进(PEP 584)。
总结
- 数据结构:
__slots__
,defaultdict
。 - 内存与 CPU 效率:生成器,NumPy,Cython。
- 算法优化:
lru_cache
,str.join()
.