动态创建具有限制的累积列表

Dynamically creating a cumulative list having a limit

我想创建一个对生成的函数 f 有限制的累积列表,如下所示,是否有任何 python-3 构造或 pythonic 方法,我可以使用它来加速这个?

import numpy as np
f = lambda x: 2**x
events = []
limit = 10
i = 0
while(True):
    if np.sum(events)+f(i)<=10:
        events.append(f(i))
    else:
        break
    i += 1

print(np.cumsum(events))

输出:

[1 3 7]

2**i 级数的累计和很容易计算:

>>> np.cumsum([2**i for i in range(100) if 2**(i+1) < limit - 1])
array([1, 3, 7])

对于任意函数 f,我将简单地过滤结果:

x = np.cumsum([f(i) for i in range(100)])
result = x[x < limit]

更新:

同样适用于使用 itertools 的无限发电机:

>>> list(itertools.takewhile(lambda x: x < limit, (2**(i+1)-1 for i in itertools.count())))
[1, 3, 7]

任意 f 函数需要很少的额外行来累加总和:

cum_sum = [0]
def update(cum_sum, val): cum_sum[0] += val; return cum_sum[0]
list(itertools.takewhile(lambda x: x < limit, (update(cum_sum, f(i)) for i in itertools.count())))