首页 › 论坛 › 置顶 › 通过这些技巧让你的Python代码速度提升10倍
正在查看 1 个帖子:1-1 (共 1 个帖子)
-
作者帖子
-
2025-05-27 10:58 #23987Q QPY课程团队管理员
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()
.
- 减少内存使用:Python 通常使用
-
作者帖子
正在查看 1 个帖子:1-1 (共 1 个帖子)
- 哎呀,回复话题必需登录。