如果我有以下序列从for循环迭代(并且此序列每次都不同),
freq = 10
for var in table:
sequence = (size * var) + sequence
size = max(size, round(sequence/freq))
# Output = 20000 30000 40000 35000 50000 60000 70000 49000 80000
当序列达到40,000时,频率变为5 当序列命中60,000时,freq变为2.5 当序列达到80,000时,频率变为1.25
问题是,当序列大于20000时,我不能简单地将频率的一半,因为它将持续一半,我可以为每个条件写出数百个if;但我觉得必须有更有效的解决方案。
答案 0 :(得分:1)
您可以跟踪上次将频率减半的记录
freq = 10
next_seq = 40000
for var in table:
sequence += (size * var)
size = max(size, round(sequence/freq))
while sequence >= next_seq:
next_seq += 20000
freq /= 2
在这种情况下,freq将等于10,直到序列等于40000,然后是5,直到序列等于60000等...
编辑:我已将if
更改为while
,以防您的序列在一次迭代中增加超过20000次。
答案 1 :(得分:0)
您可以为每var
计算一次(这可能需要也可能不需要):
这带来了额外的潜在好处,即允许不严格上升的序列。
freq = 10
for var in table:
sequence = (size * var) + sequence
if sequence < 20000:
divisor = freq
else:
divisor = freq / (2.0 ** (sequence//20000 - 1))
size = max(size, round(sequence/divisor))
# Output = 20000 30000 40000 35000 50000 60000 70000 49000 80000
这使得它从40k开始每20k递增一次:
>>> freq = 10
... for num in [0, 19999, 20000, 39999, 40000, 59999, 60000, 79999, 80000]:
... print (freq / (2.0 ** (num//20000) - 1) if num >= 20000 else freq)
10 # 0
10 # 19999
10 # 20000
10 # 39999
5.0 # 40000
5.0 # 59999
2.5 # 60000
2.5 # 79999
1.25 # 80000
注意:这依赖于整数除法来减半。在Py3中//
除法是必要的,以实现这一结果。在Py2.7上,它相当于/
。