python中的指数退避实现

时间:2017-09-14 16:29:28

标签: python recursion exponential exponential-backoff

我有两个列表' start'并且'结束'。它们的长度相同(每个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
.......

我的问题是我想从同一点开始迭代这两个列表,但是逐步沿着“结束列表”进行迭代。直到我找到一个值,其中'开始[i]'并且'结束[i + x]'大于1000。

enter image description here

我已尽最大努力做到这一点,我使用无限循环来迭代结束列表'直到与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)

我担心代码非常慢,因为我正在更新&#39; i_e&#39;通过内部while循环的每次迭代向它添加1 ... 为了解决这个问题,我想创建一个计数器&#39;变量将扩展&#39; i_e&#39;动态变量。这将通过递归来完成,其中i_e变量将以指数方式增加,直到达到所需距离的一半的点,然后将指数地减小,直到达到所需的距离。

战略插图

enter image description here

我对此的尝试如下:

我创建了一个递归函数来更新变量&#39; counter&#39;

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

我对这类问题没有经验,不确定我是否正确接近它...有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

由于whilei_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

答案 1 :(得分:0)

不确定我是否理解正确...这是你在找什么?

{% for organization in organization %}
    <h3>{{ organization.name }}</h3>

    {% for lead in organization.lead_set.all %}
        {{ lead.first_name }}
    {% endfor %}

{% endfor %}