如何偶尔为长期运行的Python列表理解提供反馈

时间:2013-02-02 11:08:08

标签: python list list-comprehension

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

from itertools import combinations

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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):
    ...

答案 2 :(得分: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)]

话虽这么说,但这更多的是破解(鉴于附加条件,它可能不会提高性能),因此,如果您需要定期打印,我绝对建议您拆开循环并处理报告逻辑更加合理。