繁体   English   中英

具有数组排序的f2py速度

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM