代码之家  ›  专栏  ›  技术社区  ›  kcw78

ndarray比recarray快吗?

  •  0
  • kcw78  · 技术社区  · 6 年前

    我能够将重新排列的数据复制到一个ndarray中,进行一些计算并返回带有更新值的ndarray。

    然后,我发现 append_fields() 能力 numpy.lib.recfunctions ,并认为简单地将两个字段附加到原始重新排列以保存计算值会更聪明。

    当我这样做时,我发现手术要慢得多。我不需要计时,基于ndarray的进程需要几秒钟,而使用recarray则需要几分钟,而且我的测试数组很小,<10000行。

    这是典型的吗?Ndaray访问比Recarray快得多?由于按字段名进行访问,我预计性能会有所下降,但不会有这么多。

    1 回复  |  直到 6 年前
        1
  •  1
  •   kcw78    6 年前

    更新日期:2018年11月15日
    我扩展了计时测试,以澄清ndarray、结构化数组、重排和屏蔽数组(记录数组的类型?)每种都有细微的差别。请参阅此处的讨论:
    numpy-discussion:structured-arrays-recarrays-and-record-arrays

    这是我的性能测试结果。我构建了一个非常简单的示例(使用我的hdf5数据集中的一个),将性能与存储在4种类型数组中的相同数据进行比较:ndarray、结构化数组、重排和屏蔽数组。在构造数组之后,它们被传递给一个函数,该函数只需遍历每一行并从每一行提取12个值。函数是从 timeit 单通函数(数字=1)。此测试仅测量数组读取函数,并避免所有其他计算。
    9000行的结果如下:

    for ndarray: 0.034137165047070615
    for structured array: 0.1306827116913577
    for recarray: 0.446010040784266
    for masked array: 31.33269560998199
    

    基于此测试,访问性能随类型的不同而降低。结构化阵列和重新排列的访问时间比nDarray访问慢4-13倍(但都只是秒的一小部分)。但是,ndarray访问比屏蔽阵列访问快1000倍。这就解释了我在完整示例中看到的秒到分钟的差异。希望这些数据对遇到这个问题的其他人有用。