【问题标题】:f2py speed with array ordering数组排序的 f2py 速度
【发布时间】:2012-09-26 16:12:22
【问题描述】:

我正在用 fortran (f2py) 编写一些代码,以便获得一些速度,因为在纯 Python 中进行大量计算会很麻烦。

我想知道在 Python 中将 NumPy 数组设置为 order=Fortran 是否会减慢速度 与经典 C 风格顺序相关的主要 Python 代码。

【问题讨论】:

    标签: python performance numpy f2py


    【解决方案1】:

    顺序会对计算速度产生很大影响。下面是一个简单的例子:

    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 代码的性能,答案是“可能”。

    【讨论】:

      【解决方案2】:

      不应该有任何减速。从 NumPy 1.6 开始,大多数 ufuncs(即基本的“通用”函数)采用可选参数,允许用户指定她的数组的内存布局:默认情况下,它是 K,这意味着输入(匹配)尽可能接近`。

      所以,一切都应该在后台处理好。

      在最坏的情况下,您始终可以使用 np.arrayorder 参数从一个订单切换到另一个订单(但这会复制您的数据,并且可能不值得)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        相关资源
        最近更新 更多