我在fortran(f2py
)中编写了一些代码,以便获得一定的速度,因为大量的计算在纯Python中非常麻烦。
我想知道将Python中的NumPy数组设置为order=Fortran
会慢下来
关于经典C风格订单的主要python代码。
答案 0 :(得分: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代码的性能的答案是“可能”。
答案 1 :(得分:1)
不应该有任何减速。从NumPy 1.6开始,大多数ufuncs
(即基本的'通用'函数)采用一个可选参数,允许用户指定数组的内存布局:默认情况下,它是K
,意思是'输入的元素排序(匹配)尽可能接近。
所以,一切都应该在引擎盖下处理。
在最糟糕的情况下,您始终可以使用order
np.array
参数从一个订单切换到另一个订单(但这会复制您的数据并且可能不值得)。