在这里挑战)
故事
我有一大堆东西:
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
)。如有任何建议,我们将不胜感激
目前没有回答
相关问题 更多 >
编程相关推荐