动态创建具有限制的累积列表
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())))
我想创建一个对生成的函数 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())))