Python / Django打印循环一路走来

时间:2012-08-08 11:28:34

标签: python wrapper django-queryset helpers

有时候,在python的某个循环中进行长时间运行的测量时,我不知道我的测量结束了。

所以我需要一个工具来打印一些进展。请参阅下面的答案。

1 个答案:

答案 0 :(得分:1)

大多数情况下,这样的测量涉及主循环内部的一些繁重处理,因此我开发了一个简单的包装函数,可以打印任何可迭代的循环进度:

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 querysets ,但是在循环之前计算总对象数本身可能很昂贵,因此在从数据库中检索所有对象时,例如 PostgreSQL < / em>最好用直接SQL替换len

"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