我是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()
其中n
是array
的大小。因此,在每次迭代中,我都会调用mean()
和std()
,它们总是被计算出来,因此需要很多时间。在'C way'
中,我会这样做,以提高性能:
mean = array.mean()
std = array.std()
standardized = (array - mean) / std
我测量了两次计算的时间,并且几乎总是同一时间。实际上,这取决于我首先使用的最快速的方法。另外,我只使用填充零的数组,也许这也会产生影响。
所以我的问题是,python
(或numPy
)如何使向量化执行“并行化”,以及它如何处理函数调用,函数调用应始终在一次迭代中返回相同的值。 / p>
我希望我的问题清楚易懂。我找不到处理此用例的任何资源。
答案 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会更好(从列表创建数组需要时间)。
有一些用于构建自定义编译块的工具-cython
,numba
等。
答案 1 :(得分:0)
我不知道numpy中有任何OpenMP风格的并行化。速度增益来自使用C / Fortran /专用库,例如LAPack / BLAS等。如果您可以负担封送处理的费用,则可以使用多处理程序来滚动自己的并行化。
如果您自己构建,似乎有一种启用OpenMP的方法:https://docs.scipy.org/doc/scipy/reference/building/linux.html