0b1111~を用いてforループの進捗状況表示のタイミングを判定する試行


forループの中で、進捗状況の表示(print)を出すタイミングをbit演算「i & 0b1111... == 0」で判定します。(よく「i % 1000 == 0」等で判定する所)

表示頻度の調節は「1」を足すだけでOK。2bit値なので2倍ずつ頻度が変化。(正確な頻度でなく)適当に調節するだけでよいなら「1」を足していくだけなのでお手軽。

bitの「&」演算1回でOK。「%」(剰余演算)よりは処理負荷低。

trial.py

# -*- coding: utf-8 -*-

# forループの進捗状況%表示タイミング「i & 0b1111.. == 0」を用いる方法

# note: np.arange(10)のコピーを大量にlistに追加すると、メモリが潤沢に使用されていく模様

import numpy as np

# sec: main

def main(if_print=True):

    if if_print:
        print("started:", end="")

    t = np.arange(10) # 処理負荷用
    n = 100000000 # 反復回数
    y = [] # 結果用
    for i in range(n):

        # sec: 処理

        y.append(t + i) # 処理負荷用

        # sec: 進捗表示

        if if_print:
            if i & 0b1_1111_1111_1111_1111_1111 == 0:
                print(f"{i / n * 100:.1f}%", end="")
            elif i & 0b1_1111_1111_1111_1111 == 0:
                print(".", end="", flush=True)

    if if_print:
        print(" ok")
        print("finished.")

    del y

# sec: entry

if __name__ == "__main__": main()

コンソール出力例:

started:0.0%...............2.1%...............4.2%..............
.6.3%...............8.4%...............10.5%...............12.6%
...............14.7%...............16.8%...............18.9%....
...........21.0%...............23.1%...............25.2%........
.......27.3%...............29.4%...............31.5%............
...33.6%...............35.7%...............37.7%...............3
9.8%...............41.9%...............44.0%...............46.1%
...............48.2%...............50.3%...............52.4%....
...........54.5%...............56.6%...............58.7%........
.......60.8%...............62.9%...............65.0%............
...67.1%...............69.2%...............71.3%...............7
3.4%...............75.5%...............77.6%...............79.7%
...............81.8%...............83.9%...............86.0%....
...........88.1%...............90.2%...............92.3%........
.......94.4%...............96.5%...............98.6%.......... ok
finished.

余談: メモリが潤沢に使用される

前述のtrial.pyを実行すると、必要以上にメモリが使用されていき、すぐにOSのメモリ使用率90%越えとなる。np.arange(10)のコピーを大量にlistに追加すると、メモリが潤沢に使用されていく模様。(PCが不安定になるようなことはない)

当処理が終了した後は、OSのメモリ使用率36%→27%となり、現在実行中のOS・アプリに必要な最低限のメモリ量が27%程度と分かる(のかもしれない)。