page contents

用这些鲜为人知(且大多数开发者都忽略)的技巧,让你的 Python 代码提速 10 倍

你可能见过太多的工程师(尤其是在高性能计算 (high-performance computing) 领域之外)低估了一些小决定的成本。比如循环方式不当、内置函数使用效率低下、忽视性能分析 (profiling),或者过度依赖 Pandas (Pandas) 来执行本可以使用 NumPy (NumPy) 或 Polars (Polars) 提速 50 倍的操作。更别提那些仍然在 Pandas 中使用 ``apply`` 而不是向量化 (vectorization) 的人了。

然而,你需要了解并牢记的是,Python 的大多数性能问题都是开发者自己造成的。问题不在于语言本身,而在于你使用它的方式。事实上,Python 的瓶颈往往是由被忽视的细节引起的:低效的数据结构 (data structures)、不必要的内存分配 (allocations)、重复的计算 (redundant computations),或者仅仅是你从其他语言带来的、不完全适用的习惯。



attachments-2025-09-7qBRRIUv68b79b88007b4.png你可能见过太多的工程师(尤其是在高性能计算 (high-performance computing) 领域之外)低估了一些小决定的成本。比如循环方式不当、内置函数使用效率低下、忽视性能分析 (profiling),或者过度依赖 Pandas (Pandas) 来执行本可以使用 NumPy (NumPy) 或 Polars (Polars) 提速 50 倍的操作。更别提那些仍然在 Pandas 中使用 ``apply`` 而不是向量化 (vectorization) 的人了。

在这篇文章中,作者不会谈论你随处可见的那些显而易见的建议,比如"使用 NumPy"或"避免 for 循环"。这些你都听过了。这是一次深入探讨那些被低估、被忽视、有时甚至有些奇特的技巧,它们能够显著加速你的 Python 代码——这些技巧你真希望能早点知道。

本文将通过实际案例、你可能没用过(但应该用)的库,以及那些悄悄侵蚀你性能的习惯,为你一一讲解。所以,如果你正在处理大型数据管道 (data pipelines)、后端 API (Application Programming Interface)、科学计算 (scientific computing),甚至是自动化基础架构 (infrastructure) 的工作——并且你觉得 Python 正在拖累你——那么这篇文章就是为你准备的。

1. 停止使用 range(len(...)) — 改用 enumerate

这看起来可能微不足道,但在某些紧密的循环中,它却出乎意料地常见且代价高昂:

# Slowfor i in range(len(my_list)):    value = my_list[i]# Faster and more Pythonicfor i, value in enumerate(my_list):    ...

使用 ``enumerate``(枚举)可以避免重复的索引和方法调用。它更简洁,并有助于解释器在底层进行更好的优化。

2. 避免将 list 用于大型集合 — 改用 array、deque 或 numpy 数组

Python 列表 (lists) 通用且灵活,但对于大型数值运算来说,它们的内存效率不高且速度不快。

from array import arraymy_array = array('i', [1, 2, 3, 4])  # Much faster than list for ints

或者更好的是,对数值数据使用 `numpy` 或 `polars.Series`。NumPy 使用由 C 语言支持的固定类型数组,而 Polars(见下文)是用 Rust 编写的,并针对速度进行了优化。

3. 使用 functools.lru\_cache 加速纯函数

如果你有计算开销大的纯函数(即,相同输入 → 相同输出),记忆化 (memoization) 可以带来显著的性能提升:

from functools import lru_cache@lru_cache(maxsize=128)def expensive_computation(x, y):    ...

这在许多机器学习 (Machine Learning) 管线中被严重低估。

4. 使用 Numba 将 Python 编译成机器码 — 无需更改代码

这是一个改变游戏规则的工具。

from numba import jit@jit(nopython=True)def compute(x):    ...

被 `@jit` 包装的函数可以运行得快 100 倍。Numba 使用 LLVM 编译你的代码,只需极少的语法改动。它最适用于循环和数值计算代码。

5. 将 Pandas 切换到 Polars 处理 DataFrame

Pandas 很棒。但对于大型数据集来说,它速度慢且是单线程的。此时,让开发者引入 `[Polars](https://pola.rs/)`,一个用 Rust 编写并支持原生多线程的极速 DataFrame 库。

import polars as pldf = pl.read_csv("data.csv")df = df.filter(pl.col("sales") > 1000)

在实际的 ETL (Extract, Transform, Load) 管线中,Polars 的性能可以比 Pandas 高 10 倍甚至更多。

6. 使用内置性能分析工具 — 不要盲目优化

在优化任何东西之前,请先进行性能分析 (Profiling)。你无法改进无法衡量的事物。

python -m cProfile my_script.py

或者更好的是,使用 `line_profiler`:

pip install line_profiler

@profiledef my_func():    ...

然后使用以下命令运行:

kernprof -l my_script.pypython -m line_profiler my_script.py.lprof

这显示了逐行的瓶颈,是性能调试 (Performance Debugging) 的利器。

7. 在紧密循环中最小化属性查找

这一个细微但非常真实:

# Badfor _ in range(1000000):    value = my_object.some_attribute# Betterattr = my_object.some_attributefor _ in range(1000000):    value = attr

每一次属性访问 (attribute access) 都是一次字典查找 (dictionary lookup)。在大型循环中,这会累积起来。

 8. 预分配列表而不是在循环中追加

追加操作方便,但在大规模操作时会很慢:

# Slowresult = []for i in range(1000000):    result.append(i)# Fasterresult = [None] * 1000000for i in range(1000000):    result[i] = i

这在数据预处理中尤为重要。

9. 尝试 Pydantic V2 (或 msgspec) 进行快速数据验证

如果你正在构建 API (Application Programming Interface) 或摄取数据,你可能正在使用 Pydantic。但 v2 用 Rust 重写,速度快得多:

from pydantic import BaseModelclass User(BaseModel):    id: int    name: str

或者,为了极致性能:

import msgspecclass User(msgspec.Struct):    id: int    name: str

`msgspec` 比 Pydantic 和 dataclasses 都快。

10. 尽可能使用生成器而不是列表

如果你不需要一次性获取所有结果,请使用生成器 (Generators):

def slow():    return [x**2 for x in range(10**6)]def fast():    return (x**2 for x in range(10**6))

内存使用量将从千兆字节降到几乎为零。

额外提示:使用 mypyc 编译你的脚本 (实验性但有前景)

如果你的模块中使用了类型提示 (type hints):

pip install mypy mypyc# Compiles your script to C extensionmypyc my_module.py

这对于数值计算代码尤其强大,而且如果你已经在使用类型标注 (typing),只需要进行极小的改动。

最终思考

大多数开发者认为 Python 运行缓慢。然而,如果使用得当,Python 的速度会出人意料地快。真正的瓶颈不在于语言本身,而在于我们的使用习惯。通过结合智能利用原生特性、未被充分利用的库以及性能优先的思维模式,我们可以在高吞吐量的生产工作负载中,也能实现全新的速度水平。

在自己的案例中,优化了生产环境中几个关键的推理评分和数据转换流水线,将运行时间从数分钟缩短到数秒。最棒的是什么?不要更换语言,也不要用 C++ 重写一切。你只需要开始将 Python 视为它本应有的强大语言——只要使用得当。

如果你认真想要从 Python 中榨取性能,请从这些建议开始。然后进行性能分析 (profile)、测试,并持续学习。总会有更快的方法。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2180 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2180 文章
  3. Pack 1343 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章