看起来填充.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秒。
我做错了什么或预期会出现这种情况?
答案 0 :(得分:1)
在有大量垃圾箱的情况下会发生这种情况。在Histogrammar的Numpy填充中,要发送到每个bin的数据被单独屏蔽:使用100个bin,您将数据运行100次。 (对于jit编译的算法,情况并非如此,例如cling和cuda。)
这个糟糕算法的罪魁祸首是Histogrammar的一般性 - 在这个结构级别,我不知道它下面是什么,所以我必须为每个bin提供单独的输入。
Histogrammar的继任者histbook不是这种情况。现在我已经添加了SparkSQL-filling到histbook,它可以满足您的需求。当它完全替代时,我会在Histogrammar的主页上重定向,但就目前而言,我一直在说这个词,但我可以。