【问题标题】:is ndarray faster than recarray access?ndarray 比 recarray 访问快吗?
【发布时间】:2019-04-07 05:16:34
【问题描述】:

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

然后,我在 numpy.lib.recfunctions 中发现了 append_fields() 功能,并认为将 2 个字段简单地附加到我的原始记录数组以保存我的计算值会更聪明。

当我这样做时,我发现操作要慢得多。我不必计时,基于 ndarray 的过程需要几秒钟,而使用 recarray 需要一分钟以上,而且我的测试数组很小,

这是典型的吗? ndarray 访问比 recarray 快得多?我预计会由于按字段名称访问而导致性能下降,但不会这么严重。

【问题讨论】:

  • 不清楚您正在比较哪些操作。 append_fields 必须定义一个新数组,并逐个字段地从源中复制数据。正在处理什么大小的数组?形状?数据类型?
  • 正如 hpaulj 所说,append_fields 创建一个新数组并复制数据,因此它会相当慢。在大多数情况下,最好只返回计算值。
  • recarray/structured array 在您想将一组混合值保存在一起时很方便 - 用于索引、排序、保存和从文件加载。大多数用户在加载csv 文件时首先遇到它们。但是对于跨字段的计算,或者添加/删除字段,它们并没有什么特别之处。具有简单数字 dtype 的单独数组更快,并且内存效率更高。
  • 感谢您的反馈。首先是一些背景知识:我使用 Pytables 从 HDF5 和 HDF5 中提取数据,只要表具有不同的类型,pytables 就会返回一个recarray。
  • 我的数据在 5 个不同的 HDF5 数据集/表中(带有 2 个不同的 dytpes)。这是一个典型的 dtype 示例: dtype([('ID', '

标签: python numpy append field recarray


【解决方案1】:

2018 年 11 月 15 日更新
我扩展了我的时序测试,以阐明 ndarray、结构化数组、recarray 和掩码数组(记录数组的类型?)的性能差异。每个都有细微的差别。请参阅此处的讨论:
numpy-discussion:structured-arrays-recarrays-and-record-arrays

这是我的性能测试结果。我构建了一个非常简单的示例(使用我的 HDF5 数据集之一)来比较存储在 4 种类型数组中的相同数据的性能:ndarray、结构化数组、recarray 和掩码数组。在构造数组之后,它们被传递给一个函数,该函数简单地遍历每一行并从每一行中提取 12 个值。这些函数从timeit 函数调用一次(编号=1)。该测试只测量数组读取函数,并避免所有其他计算。
下面给出了 9,000 行的结果:

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

根据此测试,访问性能随每种类型而降低。结构化数组和 recarray 的访问时间比 ndarray 访问慢 4 到 13 倍(但都只有几分之一秒)。但是,ndarray 访问比掩码数组访问快 1000 倍。这解释了我在完整示例中看到的秒到分钟的差异。希望这些数据对遇到此问题的其他人有用。

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多