如何正确使用生成器跳过迭代

2024-06-12 10:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找出9个省道的所有可能的组合,总数是501,最后一个省道是双倍的。下面是关于9-Dart Finish的更多信息。在

我已经设置了以下程序来创建一个生成器来遍历每个迭代,以满足所有条件。According to Steve Crook,他花了4585142217282816次迭代来得到每个组合,这将花费很长的时间。我试着忽略第一个飞镖的1,但是我等了很长时间才跳过那些组合。在

我为调试添加了一个限制,只是想看看是否可以找到任何可能的组合。我找不到任何。。。一定有更有效的方法。在

#!/usr/bin/python

import itertools
import datetime
import time

DEBUG = False

sys_time_ms=lambda:int(round(time.time()*1000))
duration=lambda start,end:datetime.timedelta(milliseconds=(end-start))
str_matrix=lambda m:'\n'.join(','.join(str(c) for c in r) for r in m)

sgl = range(1,21)           # single sections
dbl = map(lambda x:x*2,sgl) # double sections
tpl = map(lambda x:x*3,sgl) # triple sections
bul = [25,50]               # center ring and bull's eye
all = sorted(list(itertools.chain(sgl,dbl,tpl,bul)))

iter_remain  = 1000000000
darts        = list(itertools.chain(list(itertools.repeat(all, 8)),[dbl]))
comboGen     = itertools.product(*darts)
found_count  = 0
start        = sys_time_ms()

if DEBUG: print str_matrix(darts)

while True:
    if iter_remain > 0:
        try:
            combo = next(comboGen)
            if combo[0] > 1 and sum(combo) == 501:
                found_count += 1
        except StopIteration:
            print 'Reached ITERATION_LIMIT'
            break
    else:
        break
    iter_remain -= 1
end = sys_time_ms()

print 'Combinations found: {} in ({})'\
    .format(found_count, duration(start,end))

例如,上面的程序在10亿次迭代中花费了大约5.5分钟的时间,没有找到一个总和为501的组合。在

Combinations found: 0 in (0:05:35.439000)

darts矩阵应该如下所示:

^{pr2}$

Tags: lambdainimporttimesysstartmsend