我能够将我的recarray数据复制到ndarray,进行一些计算并返回具有更新值的ndarray。
然后,我在append_fields()
中发现了numpy.lib.recfunctions
功能,并认为将2个字段简单地附加到我的原始数组中来保存我的计算值会更聪明。
当我这样做时,我发现操作要慢得多。我不必花时间,与基于recarray的一分钟+相比,基于ndarray的过程要花费几秒钟,并且我的测试数组很小,小于10,000行。
这是典型的吗? ndarray访问比recarray快得多?我希望由于按字段名称进行访问而导致性能下降,但不会那么严重。
答案 0 :(得分:1)
更新日期为2018年11月15日
我扩展了时序测试,以弄清ndarray,结构化数组,recarray和masked数组(记录数组的类型?)的性能差异。每个都有细微的差异。查看此处的讨论:
numpy-discussion:structured-arrays-recarrays-and-record-arrays
这是我的性能测试的结果。我建立了一个非常简单的示例(使用我的HDF5数据集之一)来比较性能与存储在4种类型的数组中的相同数据:ndarray,结构化数组,recarray和masked数组。构造数组后,将它们传递给一个函数,该函数仅循环遍历每一行并从每一行提取12个值。从WHERE (product.id <> new_product.product_id)
函数通过一次调用(数字= 1)调用这些函数。此测试仅测量数组读取功能,并避免所有其他计算。
以下给出9,000行的结果:
SELECT SERVICE, CNT FROM (
SELECT SERVICE, COUNT(*) AS CNT
FROM SUBSCRIBERS INNER JOIN SERVICE_SUBSCRIBERS ON
SERVICE_SUBSCRIBERS.LINE=SUBSCRIBERS.PORTID
GROUP BY SERVICE
) WHERE ROWNUM = 1 ORDER BY CNT DESC
基于此测试,每种类型的访问性能都会下降。结构化数组和Recarray的访问时间比ndarray的访问时间慢4到13倍(但都只有几分之一秒)。但是,ndarray访问比屏蔽数组访问快1000倍。这就解释了我在完整示例中看到的秒到分钟的差异。希望这些数据对遇到此问题的其他人有用。