矢量化是硬件/框架特定的功能还是良好的编码习惯?

Ale*_*man 1 python parallel-processing performance numpy vectorization

我正在尝试围绕矢量化(用于数值计算)进行思考,但我遇到了看似矛盾的解释:

  • 我的理解是,它是一个内置于低级库的功能,它利用给定处理器的并行处理能力同时对多个数据点执行操作。

  • 但是一些教程似乎将其描述为一种编码实践,可以将其合并到他们的代码中以提高效率。如果它也是您正在使用的框架中拥有或没有的功能,那么它是如何编码实践的。

对我的困境更具体的解释:

  • 假设我有一个循环来计算 Python 中数字列表的运算。为了对它进行矢量化,我只需导入 Numpy,然后使用数组函数一步完成计算,而不必编写耗时的循环。Numpy 使用的低级 C 例程将代表我完成所有繁重的工作。

据我所知,了解 Numpy 以及如何导入和使用它并不是一种编码实践。这只是工具和框架的良好知识,仅此而已。

那么为什么人们一直将矢量化称为优秀编码人员在其代码中利用的编码实践呢?

hpa*_*ulj 5

矢量化在不同的上下文中可能意味着不同的东西。在numpy我们通常意味着使用编译numpy的方法来对整个阵列的工作。实际上,这意味着将任何循环从解释过的 Python 中移到编译后的代码中。这是非常具体的numpy

numpy几年前我来自 MATLAB,在那之前是 APL(以及作为学生的物理/数学)。因此,很长一段时间以来,我一直习惯于从整个数组/向量/矩阵的角度进行思考。

MATLAB 现在有很多即时编译,因此程序员可以编写迭代代码而不会降低性能。 numba(和cython) 允许numpy用户做一些相同的事情,尽管仍然有很多粗糙的边缘 - 正如在numpa标记的问题中所见。

并行化和其他利用现代多核计算机的方法是一个不同的话题。这通常需要使用额外的包。

我对循环不是 Pythonic 的评论提出异议。我应该有点资格。Python 确实有避免大的、难以阅读的循环的工具,比如列表推导式、生成器和其他推导式。通过将推导式和生成器串在一起来执行复杂的任务是 Python 的良好实践,但这不是“向量化”(在 numpy 意义上)。