填充numpy数组比for循环慢(h.fill vs h.fill.numpy)

时间:2018-06-12 15:34:01

标签: histogrammar

看起来填充.fill的直方图比填充.fill.numpy更快。 对于这两种情况,我的数据都在一个命名元组中:

Event = namedtuple("Event", ['nHGPulses', 'HGs1',
                             'HGs2', 'nHGs1', 'nHGs2', 'area_phd', 'width'])

我想填的直方图是

h2_areawidth_pulses = hg.Bin(100, 0, 500, lambda x: x[0], hg.Bin(1000, 0, 5000, lambda x: x[1]))
for event in events:
    for a, w in zip(event.area_phd, event.width):
        h2_areawidth_pulses.fill((a, w))

或numpy case

h2_areawidth_pulses = hg.Bin(100, 0, 500, lambda event: event.area_phd, hg.Bin(1000, 0, 5000, lambda event: event.width))
for event in events:
    h2_areawidth_pulses.fill.numpy(event)

在相同条件下.fill在10秒内运行,而.fill.numpy需要195秒。

我做错了什么或预期会出现这种情况?

1 个答案:

答案 0 :(得分:1)

在有大量垃圾箱的情况下会发生这种情况。在Histogrammar的Numpy填充中,要发送到每个bin的数据被单独屏蔽:使用100个bin,您将数据运行100次。 (对于jit编译的算法,情况并非如此,例如cling和cuda。)

这个糟糕算法的罪魁祸首是Histogrammar的一般性 - 在这个结构级别,我不知道它下面是什么,所以我必须为每个bin提供单独的输入。

Histogrammar的继任者histbook不是这种情况。现在我已经添加了SparkSQL-filling到histbook,它可以满足您的需求。当它完全替代时,我会在Histogrammar的主页上重定向,但就目前而言,我一直在说这个词,但我可以。