详细内容或原文请订阅后点击阅览
3 个 NumPy 数值性能技巧
在本文中,我们将介绍优化代码的三个基本 NumPy 技巧:矢量化和广播、就地操作以及利用内存视图而不是副本。
来源:KDnuggets简介
Python 科学计算和机器学习生态系统严重依赖 NumPy。它充当 Pandas、Scikit-Learn、SciPy 和 PyTorch 等库背后的性能引擎。 NumPy 的速度来自于其在优化的 C 语言中的底层实现,其中连续的内存块的操作无需 Python 对象模型和动态解释器的开销。
不幸的是,许多数据科学家和开发人员编写的 NumPy 代码未能利用这种能力。通过继承标准 Python 循环或编写强制执行不必要的内存分配和数组复制的简单计算,会遭受性能瓶颈。当处理大型数据集时,这些低效率会导致 RAM 使用量膨胀、缓存未命中和执行时间缓慢。要编写高性能数字代码,您必须了解 NumPy 如何在幕后管理计算、内存分配和数据布局。
在本文中,我们将介绍优化代码的三个基本 NumPy 技巧:
1. 通过显式循环进行矢量化和广播
显式 Python for 循环是数值计算中最大的速度杀手。逐个元素地迭代数据结构会迫使 Python 解释器在每一步执行类型检查和方法查找。
一个常见的陷阱是使用 np.vectorize。许多开发人员认为使用 np.vectorize 包装标准 Python 函数会将其转换为优化的 C 代码。实际上,np.vectorize 只是一个方便的包装器,它在更干净的 API 后面运行一个缓慢的标准 Python 循环,提供零性能优势。
要优化,您必须使用本机通用函数 (ufunc) 和广播来编写代码。广播允许 NumPy 对不同形状的数组执行操作,而无需复制数据,直接在编译后的 C 中处理操作。
输出:
速度提升了约 56 倍!
总结
回顾一下:
