有效地选择每个项目都有可能被挑选的子集

2024-10-06 11:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

在这里挑战)

故事

我有一大堆东西:

OBJS = [o_1, o_2, ..., o_n]

每个对象都可以重新计算(这是非常昂贵的)。在重新计算期间,它可以从序列中添加和删除项目:

class Obj:
    def recalculate(self):
        # some expensive calcs here
        ...

        # may add objects
        if create_new_obj:
            OBJS.append(Obj())

        # may remove objects
        if delete_obj:
            del OBJS[idx]

我有一个循环来重新计算它们,我想以尽可能快的速度迭代:

while True:
    for obj in OBJS:
        obj.recalculate()

我能做的是在每次迭代中重新计算它们。我可以将probability属性添加到Obj类,或将概率添加到如下序列:

OBJS = [
    [o_1, 0.0001],  # recalculate once per 10 000 iterations in average
    [o_2, 1.0],  # recalculate each iteration
    ...,
    [o_n, 0.5]  # recalculate once per 2 iterations in average
]

创建一个生成器,返回要在此迭代中重新计算的对象子集:

def pick_subset_of_randoms(sequence):
    for obj, probability in sequence:
        if random.random() <= probability:
            yield obj

更新循环如下:

while True:
    for obj in pick_subset_of_randoms(OBJS):
        obj.recalculate()

问题

有没有机会优化pick_subset_of_randoms生成器

完美的变体是避免for循环遍历所有序列。因为子集长度可能比序列长度小几万倍或几十万倍

允许使用第三方包(比如numpy)。如有任何建议,我们将不胜感激


Tags: of对象inobjforifdef序列