具有不同连续类型的numpy数组的加法速度

时间:2016-09-29 13:18:37

标签: python arrays performance numpy contiguous

Numpy数组存储有不同的连续类型(C-和F-)。使用numpy.swapaxes()时,连续类型会发生变化。我需要添加两个多维数组(3d更具体),其中一个来自另一个具有交换轴的数组。我注意到的是当第一个轴与最后一个轴交换时,在3d数组的情况下,连续类型从C-变为F-。添加两个具有不同连续类型的数组非常慢(比添加两个C连续数组慢约6倍)。但是,如果交换其他轴(0-1或1-2),则生成的数组将具有C-和F-连续(非连续)的错误标志。对我来说奇怪的是,添加一个C-configuous数组和一个既不是C-也不是F-连续的数组,实际上只比添加两个相同类型的数组稍慢。以下是我的两个问题:

  1. 为什么C-& F-连续arrray添加和C-&非连续阵列添加似乎有所不同?是由不同的重新排列机制引起的,还是仅仅因为所有可能的轴顺序的C-和F-连续之间的重新排列距离最长?

  2. 如果我必须添加一个C连续数组和一个F连续/非连续数组,那么加速速度的最佳方法是什么?

  3. 以下是我遇到的最低限度示例。我计算机上的三个打印持续时间是2.0s(C连续+ C连续),12.4s(C连续+ F连续),3.4s(C连续+非连续)和3.3s(C连续) +非连续)。

    import numpy as np
    import time
    
    np.random.seed(1234)
    
    a = np.random.random((300, 400, 500))  # C-contiguous
    b = np.swapaxes(np.random.random((500, 400, 300)), 0, 2)  # F-contiguous
    c = np.swapaxes(np.random.random((300, 500, 400)), 1, 2)  # Non-contiguous
    d = np.swapaxes(np.random.random((400, 300, 500)), 0, 1)  # Non-contiguous
    
    t = time.time()
    for n in range(10):
        result = a + a
    print(time.time() - t)
    
    t = time.time()
    for n in range(10):
        result = a + b
    print(time.time() - t)
    
    t = time.time()
    for n in range(10):
        result = a + c
    print(time.time() - t)
    
    t = time.time()
    for n in range(10):
        result = a + d
    print(time.time() - t)
    

1 个答案:

答案 0 :(得分:0)

这些类型(FC)表示矩阵(或多维数组)是否存储在列主要(C中,如同使用列主要的C语言一样存储)或行主要(F,如Fortran语言,它使用行主存储。)

两者的速度并没有真正变化。它只是一个抽象层。无论你使用哪一个,它都会带来同样的性能。

然而,最重要的是阵列是否连续。如果它们是连续的,那么您将获得编译器可能应用的缓存效果,矢量化和其他优化游戏的良好时序。