代码之家  ›  专栏  ›  技术社区  ›  DragonTux

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

  •  1
  • DragonTux  · 技术社区  · 8 年前

    它看起来像是用 .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))
    

    或者是纽比的案子

    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)
    

    在相同条件下 填充 在10秒内运行 填充。 以1958年为例。

    我是做错了什么,还是应该有这种行为?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Jim Pivarski    8 年前

    这种情况可能发生在有大量垃圾箱的情况下。在历史语法的numpy填充中,要发送到每个bin的数据是单独屏蔽的:使用100个bin,可以对数据运行100次。(对于jit编译的算法,比如clagn和cuda,情况并非如此。)

    这个糟糕算法的罪魁祸首是历史语法在结构层次上的普遍性,我不知道它下面是什么,所以我必须为每个bin提供单独的输入。

    历史语法的继承者histbook就不是这样了。现在我已经在histbook中添加了sparksql填充,它可以满足您的需要。当它被完全替换时,我会在历史语法的主页上进行重定向,但是现在,我已经尽我所能地说出了这个词。

    推荐文章