首页 论坛 置顶 通过这些技巧让你的Python代码速度提升10倍

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • #23987

    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().
正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。