有时,在 python 的某个循环中进行长时间运行的测量时,我不知道我的测量何时完成。
所以我需要一个工具来打印一些进展。请看下面我的回答。
有时,在 python 的某个循环中进行长时间运行的测量时,我不知道我的测量何时完成。
所以我需要一个工具来打印一些进展。请看下面我的回答。
大多数情况下,这种测量涉及主循环内部的一些繁重处理,因此我开发了一个简单的包装函数,可以打印任何可迭代的循环进度:
from datetime import datetime
def print_progress(iterable, percent_step=1):
total = float(len(iterable))
# or 1 means that iterable has < 100 elems
abs_step = int((total * percent_step)/100) or 1
for i, obj in enumerate(iterable):
if i and not i % abs_step:
print "{0:.2%} processed, {1:%H:%M:%S}".format(i/total, datetime.now())
yield obj
percent_step
参数定义打印的粒度级别:每次循环完成处理percent_step
数据量的百分比时,将处理数据的总百分比打印在屏幕上。
然后可以将此包装器应用于循环:
for x in print_progress(my_list):
# processing
...
相同的迭代器可以应用于django查询集,但是在循环之前计算总对象计数本身可能很昂贵,因此如果从PostgreSQL等数据库中检索所有对象,最好len
用直接 SQL 替换:
"select reltuples from pg_class where relname='%s'" % table_name
def print_progress(iterable, second_step=10):
total = float(len(iterable))
import time
time1 = time.time()
for i, obj in enumerate(iterable):
if time.time() - time1 > second_step:
print "{0:.2%} processed".format(i/total)
time1 = time.time()
yield obj