通过这些技巧让你的Python代码速度提升10倍

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().

更多