具有数组排序的f2py速度

时间:2012-09-26 16:12:22

标签: python performance numpy f2py

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

我想知道将Python中的NumPy数组设置为order=Fortran会慢下来 关于经典C风格订单的主要python代码。

2 个答案:

答案 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参数从一个订单切换到另一个订单(但这会复制您的数据并且可能不值得)。