在矢量化操作中调用numpy函数是否会影响性能?

时间:2019-08-21 09:50:08

标签: python performance numpy

我是python的新手,目前正在研究numPy软件包。我来自C/C++世界,所以也许我的问题很愚蠢。在numPy中使用向量化操作时,我假设它们像openMP一样使执行并行化。

我在一个udacity教程中遇到了一段代码,该代码以一种下面的方式计算了标准化的一维数组:

standardized = (array - array.mean()) / array.std()

其中数组是numPy数组。因此,在我眼中,numPy将使以下“单个”指令无效,以获得更好的性能:

standardized[0] = (array[0] - array.mean()) / array.std()
standardized[1] = (array[1] - array.mean()) / array.std()
...
...
standardized[n] = (array[n] - array.mean()) / array.std()

其中narray的大小。因此,在每次迭代中,我都会调用mean()std(),它们总是被计算出来,因此需要很多时间。在'C way'中,我会这样做,以提高性能:

mean = array.mean()
std = array.std()
standardized = (array - mean) / std

我测量了两次计算的时间,并且几乎总是同一时间。实际上,这取决于我首先使用的最快速的方法。另外,我只使用填充零的数组,也许这也会产生影响。

所以我的问题是,python(或numPy)如何使向量化执行“并行化”,以及它如何处理函数调用,函数调用应始终在一次迭代中返回相同的值。 / p>

我希望我的问题清楚易懂。我找不到处理此用例的任何资源。

2 个答案:

答案 0 :(得分:2)

standardized = (array - array.mean()) / array.std()

是一个Python表达式,其计算结果为:

temp1 = array.mean()     
temp2 = array.std()
temp3 = (array - temp1)
temp4 = temp3 / temp2

array.mean是一个numpy的“内置”方法,这意味着它是用已编译的代码编写的。与std相同。并用于两个数组的减法和除法。

numpy提供了构建基块,python提供了将它们连接在一起的胶水。通常,最佳策略是最大程度地利用这些numpy方法。并避免在Python级别循环。有时,对复杂操作进行几次循环会更好,有时使用基本Python会更好(从列表创建数组需要时间)。

有一些用于构建自定义编译块的工具-cythonnumba等。

答案 1 :(得分:0)

我不知道numpy中有任何OpenMP风格的并行化。速度增益来自使用C / Fortran /专用库,例如​​LAPack / BLAS等。如果您可以负担封送处理的费用,则可以使用多处理程序来滚动自己的并行化。

如果您自己构建,似乎有一种启用OpenMP的方法:https://docs.scipy.org/doc/scipy/reference/building/linux.html