【问题标题】:Python/Django print loop progress along the wayPython/Django 打印循环沿途进度
【发布时间】:2012-08-05 12:07:27
【问题描述】:

有时,在 python 中的某个循环中进行长时间运行的测量时,我不知道我的测量何时会完成。

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

【问题讨论】:

    标签: python wrapper django-queryset helpers


    【解决方案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 查询集,但是在循环之前计算总对象计数本身可能会很昂贵,因此如果从数据库中检索所有对象,例如 PostgreSQL 最好直接用 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
    

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2018-02-04
      • 1970-01-01
      相关资源
      最近更新 更多