|
|
|
@ -2,7 +2,7 @@
|
|
|
|
|
从计算机系统结构的角度,提高 Python 任务执行速度的核心在于:减少解释器开销(编译/JIT)、提升并行性(多核/GPU)、优化内存访问(缓存友好)、降低 I/O 瓶颈以及适配硬件特性等。当前主要办法如下:
|
|
|
|
|
|
|
|
|
|
### 计算单元层面利用多核并行计算
|
|
|
|
|
对于 CPU 密集型任务,使用多进程,每个进程拥有独立的 Python 解释器和内存空间运行在独立的内核上,实现并行计算。
|
|
|
|
|
对于 CPU 密集型任务,使用多进程,每个进程拥有独立的 Python 解释器和内存空间,运行在独立的内核上,实现并行计算。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### I/O 层面减少等待时间
|
|
|
|
@ -12,30 +12,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 编译层面减少解释器开销
|
|
|
|
|
- 使用 JIT 编译器:Just-In-Time(JIT)编译可以在运行时将Python代码编译成机器码,从而提升执行速度 。PyPy 是一种替代 CPython 的实现,使用 JIT 技术,PyPy 的 JIT 引擎可以分析代码执行路径,优化频繁调用的函数,充分利用处理器架构。
|
|
|
|
|
- **Cython 编译**:Cython 允许开发者为 Python 代码添加 C 类型的注解,并编译为 C 代码,再由 C 编译器生成机器码。Cython 特别适合静态类型优化的场景。
|
|
|
|
|
- 使用 JIT 编译器:Just-In-Time(JIT)编译可以在运行时将Python代码编译成机器码,从而提升执行速度 。PyPy 是一种替代 CPython 的实现,PyPy 的 JIT 引擎可以分析代码执行路径,优化频繁调用的函数,充分利用处理器架构。
|
|
|
|
|
- **Cython 编译**:Cython 允许开发者为 Python 代码添加 C 类型注解,并编译为 C 代码,再由 C 编译器生成机器码。Cython 特别适合静态类型优化场景。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 利用Python的解释器特性
|
|
|
|
|
- **使用内置数据类型和函数**:内置的数据类型(如列表、字典、集合等)和函数通常经过高度优化。
|
|
|
|
|
- **选择合适的数据结构**:例如,一些类型执行一些操作更快,一些类型更省空间
|
|
|
|
|
- **选择合适的数据结构**:例如,一些类型执行一些操作更快,一些类型更省空间。
|
|
|
|
|
- **减少全局变量的使用**:访问全局变量通常比局部变量慢,因为它们需要在更大的作用域中查找。
|
|
|
|
|
- **减少函数调用**,可降低堆栈操作开销。
|
|
|
|
|
- 使用列表推导式替代循环追加,避免频繁创建和销毁临时对象的开销。
|
|
|
|
|
- 使用列表推导式替代循环,降低频繁创建和销毁临时对象的开销。
|
|
|
|
|
- 使用生成器而不是列表来处理大数据集,以减少内存占用。
|
|
|
|
|
- 使用XX池或预分配资源。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 使用第三方高性能库
|
|
|
|
|
- NumPy、Pandas这些库用 C/C++ 编写并经过优化。
|
|
|
|
|
- NumPy 使用连续内存块存储数据,向量化操作来代替显式的Python循环更高效 。
|
|
|
|
|
- SIMD 指令加速,NumPy、Numba、Pandas/SciPy 都使用了SIMD。Cython 可以直接用 C 代码使用SIMD 。
|
|
|
|
|
- NumPy 使用连续内存块存储数据,向量化操作来代替显式的Python循环,更高效 。
|
|
|
|
|
- SIMD 指令加速,NumPy、Numba、Pandas/SciPy 都使用了 SIMD。Cython 可以直接用 C 代码使用 SIMD 。
|
|
|
|
|
- `gzip` 模块可压缩数据,减少网络传输的数据量,提高网络传输速度。
|
|
|
|
|
- `mmap` 模块进行内存映射文件,处理超大文件、优化I/O性能以及进程间通信方面具有显著优势。
|
|
|
|
|
- `functools.lru_cache` 缓存计算结果,避免重复计算 。
|
|
|
|
|
- `mmap` 模块实现内存映射文件,在处理超大文件、优化I/O性能以及进程间通信方面具有显著优势。
|
|
|
|
|
- `functools.lru_cache` 缓存计算结果,避免重复计算 。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 总结
|
|
|
|
|
具体实施时,应根据任务类型(CPU 密集型、I/O 密集型或混合型)选择合适的优化策略,并结合性能分析工具(如 cProfile 、timeit或 line_profiler)定位瓶颈。
|
|
|
|
|
计算设备方面的简单提升办法:使用多机、更快的 CPU、更多核的CPU、更多的内存、更快的存储、使用 GPU/FPGA/TPU 。
|
|
|
|
|
此外,随着Python社区的发展,新的技术和工具不断涌现,开发者应持续关注最新的进展,以便更好地优化自己的代 。
|
|
|
|
|
具体实施时,应根据任务特点选择合适的策略,并结合性能分析工具(如 cProfile 、timeit或 line_profiler)定位瓶颈。
|
|
|
|
|
计算设备方面的简单提升办法:使用多机、更快的 CPU、更多核的CPU、更多的内存、更快的存储、增加 GPU/FPGA/TPU 。
|
|
|
|
|
此外,随着Python社区的发展,新的技术和工具不断涌现,开发者应持续关注最新进展,以便更好地优化自己的代码 。
|