2

如果您在 Python 中有一个长期运行的列表理解,请说:

from itertools import combinations

print [w for w in (''.join(c) for c in combinations(words, 2)) if sorted(w) == letters]

其中 words 是 200000 个单词的列表,而 letters 是字母列表;有没有办法偶尔打印出到目前为止已经处理了多少字或其他形式的进度报告?

4

3 回答 3

1

您需要将其转换为正常循环;不要尝试混合副作用功能:

from itertools import combinations

result = []
count = 0
for w in (''.join(c) for c in combinations(words, 2)):
    if sorted(w) == letters:
        result.append(w)
        count += 1
        if count % 2000 == 0:
            print 'Progress: {0} matching combinations found'.format(count)

print result

或者,如果您想跟踪测试的组合,请将计数移到if

from itertools import combinations

result = []
count = 0
for w in (''.join(c) for c in combinations(words, 2)):
    count += 1
    if count % 2000 == 0:
        print 'Progress: {0} combinations scanned'.format(count)

    if sorted(w) == letters:
        result.append(w)

print result
于 2013-02-02T11:12:09.647 回答
1

这是一个生成器,可以向日志报告进度。

def log_every(seq, every):
    for i, x in enumerate(seq):
        if (i + 1) % every == 0:
            logging.info('Generated %d', i)
        yield x

像这样使用它:

for c in log_every(combinations(words, 2), 2000):
    ...
于 2013-02-02T11:34:08.687 回答
0

为了完整起见,您可以使用一个技巧来定期打印列表理解的状态 - 例如,在每 10,000 次处理时打印一条消息,同时生成您可以使用的仅奇数列表:

test = [x for x in range(100000)
        if x % 2 or (x % 10000 == 0 and print("Processed: " + str(x)) is None and x % 2)]

话虽如此,这更像是一种 hack(考虑到额外的条件,它可能不会提高性能)所以如果你需要定期打印输出,我肯定会建议你解开你的循环并以更理智的方式处理报告逻辑方式。

于 2018-10-06T11:41:02.843 回答