python 中的指数退避实现
exponential backoff implementation in python
我有两个列表 'start' 和 'end'。它们的长度相同(每个 400 万):
for i in xrange(0,len(start)):
print start[i], end[i]
3000027 3000162
3000162 3000186
3000186 3000187
3000187 3005000
3005000 3005020
3005020 3005090
3007000 3007186
3007186 3009000
3009000 3009500
.......
我的问题是我想迭代这两个列表,从同一点开始,但是沿着 'end list' 逐步迭代,直到我找到一个值,其中 'start[i]' 和 'end[i+x]'大于1000。
我已尽最大努力这样做,我使用无限循环迭代 'end list' 直到与 start 的差异超过 1000,然后从该点开始并从那里执行相同的操作。 .
注:旧内容省略
最终我要找的输出是(以上面的说明图为例):
print density
[4, 2, 1 ...........]
谁能帮我解决这个问题?
更新
虽然之前对这个问题的回答确实有效:
density=[]
i_s = 0
while i_s < len(start):
i_e = i_s
while i_e < len(end):
if end[i_e] - start[i_s] > 1000:
density.append(i_e - i_s + 1)
i_s = i_e
break
i_e += 1
i_s += 1
print sum(density)/float(len(density))
print max(density)
print min(density)
恐怕代码非常慢,因为我正在更新 'i_e' 的扩展,方法是在内部 while 循环的每次迭代中向其添加 1...
为了解决这个问题,我想创建一个 'counter' 变量来动态扩展 'i_e' 变量。这将通过递归完成,其中 i_e 变量将呈指数增长,直到达到所需距离的一半,然后呈指数下降,直到达到所需距离。
攻略图解
我的尝试如下:
我创建了一个递归函数来更新变量'counter'
counter=1 ##### initialise counter with value of 1
def exponentially_increase_decrease(start, end, counter):
distance=end-start
if distance<=500: ###500 is half the desired distance
counter=exponentially_increase_decrease(start, end, counter*2)
else:
counter=-exponentially_increase_decrease(start, end, counter/2)
print counter
return counter
在原代码中调用函数:
density=[]
i_s = 0
while i_s < len(start):
i_e = i_s
while i_e < len(end):
if end[i_e] - start[i_s] > 1000:
density.append(i_e - i_s + 1)
i_s = i_e
break
counter=counter=exponentially_increase_decrease(i_s, i_e, counter)
i_e += counter
i_s += 1
我收到以下错误:
(打印数千次)
counter=exponentially_increase_decrease(start, end, counter*2)
RuntimeError: maximum recursion depth exceeded
我没有遇到过此类问题,不确定我是否正确处理它...有人可以帮忙吗?
不确定我是否理解正确...这是您要查找的内容吗?
MAX_DIFF = 1000
density = [0] * len(start)
for i in range(len(start)):
for j in range(i, len(end)):
density[i] += 1
if end[i] - start[i] >= MAX_DIFF:
break
print(density)
这是我发现 while
循环更直接的少数情况之一,因为 i_e
和 i_s
相互依赖。您可以使用两个 range
迭代器,并根据您从后者消耗的量来推进前者,但这似乎过于复杂。
>>> start
[3000027, 3000162, 3000186, 3000187, 3005000, 3005020, 3007000, 3007186, 3009000]
>>> end
[3000162, 3000186, 3000187, 3005000, 3005020, 3005090, 3007186, 3009000, 3009500]
>>> i_s = 0
>>> while i_s < len(start):
... i_e = i_s
... while i_e < len(end):
... if end[i_e] - start[i_s] > 1000:
... print(i_e - i_s + 1)
... i_s = i_e
... break
... i_e += 1
... i_s += 1
...
4
3
1
我有两个列表 'start' 和 'end'。它们的长度相同(每个 400 万):
for i in xrange(0,len(start)):
print start[i], end[i]
3000027 3000162
3000162 3000186
3000186 3000187
3000187 3005000
3005000 3005020
3005020 3005090
3007000 3007186
3007186 3009000
3009000 3009500
.......
我的问题是我想迭代这两个列表,从同一点开始,但是沿着 'end list' 逐步迭代,直到我找到一个值,其中 'start[i]' 和 'end[i+x]'大于1000。
我已尽最大努力这样做,我使用无限循环迭代 'end list' 直到与 start 的差异超过 1000,然后从该点开始并从那里执行相同的操作。 .
注:旧内容省略
最终我要找的输出是(以上面的说明图为例):
print density
[4, 2, 1 ...........]
谁能帮我解决这个问题?
更新
虽然之前对这个问题的回答确实有效:
density=[]
i_s = 0
while i_s < len(start):
i_e = i_s
while i_e < len(end):
if end[i_e] - start[i_s] > 1000:
density.append(i_e - i_s + 1)
i_s = i_e
break
i_e += 1
i_s += 1
print sum(density)/float(len(density))
print max(density)
print min(density)
恐怕代码非常慢,因为我正在更新 'i_e' 的扩展,方法是在内部 while 循环的每次迭代中向其添加 1... 为了解决这个问题,我想创建一个 'counter' 变量来动态扩展 'i_e' 变量。这将通过递归完成,其中 i_e 变量将呈指数增长,直到达到所需距离的一半,然后呈指数下降,直到达到所需距离。
攻略图解
我的尝试如下:
我创建了一个递归函数来更新变量'counter'
counter=1 ##### initialise counter with value of 1
def exponentially_increase_decrease(start, end, counter):
distance=end-start
if distance<=500: ###500 is half the desired distance
counter=exponentially_increase_decrease(start, end, counter*2)
else:
counter=-exponentially_increase_decrease(start, end, counter/2)
print counter
return counter
在原代码中调用函数:
density=[]
i_s = 0
while i_s < len(start):
i_e = i_s
while i_e < len(end):
if end[i_e] - start[i_s] > 1000:
density.append(i_e - i_s + 1)
i_s = i_e
break
counter=counter=exponentially_increase_decrease(i_s, i_e, counter)
i_e += counter
i_s += 1
我收到以下错误:
(打印数千次)
counter=exponentially_increase_decrease(start, end, counter*2)
RuntimeError: maximum recursion depth exceeded
我没有遇到过此类问题,不确定我是否正确处理它...有人可以帮忙吗?
不确定我是否理解正确...这是您要查找的内容吗?
MAX_DIFF = 1000
density = [0] * len(start)
for i in range(len(start)):
for j in range(i, len(end)):
density[i] += 1
if end[i] - start[i] >= MAX_DIFF:
break
print(density)
这是我发现 while
循环更直接的少数情况之一,因为 i_e
和 i_s
相互依赖。您可以使用两个 range
迭代器,并根据您从后者消耗的量来推进前者,但这似乎过于复杂。
>>> start
[3000027, 3000162, 3000186, 3000187, 3005000, 3005020, 3007000, 3007186, 3009000]
>>> end
[3000162, 3000186, 3000187, 3005000, 3005020, 3005090, 3007186, 3009000, 3009500]
>>> i_s = 0
>>> while i_s < len(start):
... i_e = i_s
... while i_e < len(end):
... if end[i_e] - start[i_s] > 1000:
... print(i_e - i_s + 1)
... i_s = i_e
... break
... i_e += 1
... i_s += 1
...
4
3
1