0

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

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

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

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

4

1 回答 1

4

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-11-05T19:51:50.530 回答