如果你在Python中有一个长期运行的列表理解,请说:
from itertools import combinations
print [w for w in (''.join(c) for c in combinations(words, 2)) if sorted(w) == letters]
其中单词是200000个单词的列表,而单词是一个字母列表;有没有办法偶尔打印到目前为止处理了多少单词或其他形式的进度报告?
答案 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)]
话虽这么说,但这更多的是破解(鉴于附加条件,它可能不会提高性能),因此,如果您需要定期打印,我绝对建议您拆开循环并处理报告逻辑更加合理。