1

我在 fortran ( f2py) 中编写了一些代码,以便获得一些速度,因为在纯 Python 中进行大量计算会非常麻烦。

我想知道在 Python 中设置 NumPy 数组是否order=Fortran会降低主要 Python 代码相对于经典 C 样式顺序的速度。

4

2 回答 2

3

顺序可以对计算速度产生很大影响。下面显示了一个简单的示例:

In [15]: x = np.ones((1000, 1000))

In [16]: y = np.ones((1000, 1000), order='F')

In [17]: %timeit x.sum(axis=0)
100 loops, best of 3: 8.03 ms per loop

In [18]: %timeit y.sum(axis=0)
1000 loops, best of 3: 1.02 ms per loop

在此示例中,对 C 有序数组的列求和所需的时间是对 Fortran 有序数组求和的 8 倍。如果在另一个轴上执行求和,则 C 有序数组上的计算会更快:

In [19]: %timeit x.sum(axis=1)
1000 loops, best of 3: 1.02 ms per loop

In [20]: %timeit y.sum(axis=1)
100 loops, best of 3: 8.09 ms per loop

因此,对于使用 Fortran 有序数组是否会影响 Python 代码的性能,答案是“可能”。

于 2012-09-26T22:06:41.243 回答
1

不应该有任何减速。从 NumPy 1.6 开始,大多数ufuncs(即基本的“通用”函数)采用一个可选参数,允许用户指定她的数组的内存布局:默认情况下,它是K,这意味着“输入的元素排序(匹配)尽可能接近`。

所以,一切都应该在引擎盖下得到照顾。

order在最坏的情况下,您总是可以使用参数从一个订单切换到另一个订单np.array(但这会复制您的数据并且可能不值得)。

于 2012-09-26T16:56:25.820 回答