【发布时间】:2012-09-26 16:12:22
【问题描述】:
我正在用 fortran (f2py) 编写一些代码,以便获得一些速度,因为在纯 Python 中进行大量计算会很麻烦。
我想知道在 Python 中将 NumPy 数组设置为 order=Fortran 是否会减慢速度
与经典 C 风格顺序相关的主要 Python 代码。
【问题讨论】:
标签: python performance numpy f2py
我正在用 fortran (f2py) 编写一些代码,以便获得一些速度,因为在纯 Python 中进行大量计算会很麻烦。
我想知道在 Python 中将 NumPy 数组设置为 order=Fortran 是否会减慢速度
与经典 C 风格顺序相关的主要 Python 代码。
【问题讨论】:
标签: python performance numpy f2py
顺序会对计算速度产生很大影响。下面是一个简单的例子:
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 参数从一个订单切换到另一个订单(但这会复制您的数据,并且可能不值得)。
【讨论】: