我在 fortran ( f2py
) 中编写了一些代码,以便获得一些速度,因为在纯 Python 中进行大量计算会非常麻烦。
我想知道在 Python 中设置 NumPy 数组是否order=Fortran
会降低主要 Python 代码相对于经典 C 样式顺序的速度。
我在 fortran ( f2py
) 中编写了一些代码,以便获得一些速度,因为在纯 Python 中进行大量计算会非常麻烦。
我想知道在 Python 中设置 NumPy 数组是否order=Fortran
会降低主要 Python 代码相对于经典 C 样式顺序的速度。
顺序可以对计算速度产生很大影响。下面显示了一个简单的示例:
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 代码的性能,答案是“可能”。
不应该有任何减速。从 NumPy 1.6 开始,大多数ufuncs
(即基本的“通用”函数)采用一个可选参数,允许用户指定她的数组的内存布局:默认情况下,它是K
,这意味着“输入的元素排序(匹配)尽可能接近`。
所以,一切都应该在引擎盖下得到照顾。
order
在最坏的情况下,您总是可以使用参数从一个订单切换到另一个订单np.array
(但这会复制您的数据并且可能不值得)。