[英]f2py speed with array ordering
我正在写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
,意思是'输入的元素排序(是匹配)尽可能接近。
因此,一切都应该在引擎盖下照顾。
在最坏的情况下,您总是可以使用np.array
的order
参数从一个订单切换到另一个order
(但这会复制您的数据并且可能不值得)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.