Python

간편한 Progress Bar 모듈 - tqdm

둔진 2020. 4. 26. 14:29

  큰 데이터를 다루다 보면 지금 프로세싱이 어디까지 처리됐는지 궁금할 때가 있습니다. 텍스트 파일에서 한 줄씩 읽어서 전처리를 할 때도 그렇고요. 데이터를 여기에서 저기로 옮길 때도 그렇고요. 시간이 너무 오래 걸리다 보면 '어딘가에서 무한루프를 돌고 있는 것은 아닐까', '코드를 잘못 짜서 한번 도는데 너무 오래 걸리는 것이 아닐까' 등등 많은 생각이 듭니다. 불안한 마음에 Ctrl+C를 확 눌러버릴까 유혹도 받지요. 자리를 잠시 비우기도 애매하고요. 꼭 자리를 비울 때 에러를 내고 죽으니까요.

  가상의 상황을 가정해서 아래처럼 한번에 0.05초가 걸리는 작업을 100번 돌린다고 생각해보겠습니다. 이 경우야 5초면 끝나겠지만 큰 데이터를 다루다 보면 도대체 언제 끝날지 감이 안 올 때가 많습니다. 그리고 기다리는 동안 아래와 같은 답답함이 연출되죠.

import time

def heavy_job():
    time.sleep(0.05)
    return

for i in range(100):
    heavy_job()

 

    그래서 중간 상황을 확인하려고 print로 로그를 찍기도 하고, 조금 더 그럴 듯하게 logging 모듈을 이용해서 로그를 남기기도 합니다.

  이런 상황을 아주 우아하면서도 쉽게 해결해주는 모듈이 있습니다. 바로 tqdm (https://github.com/tqdm/tqdm) 입니다.

  tqdm을 사용하기 위해서는 아래처럼 패키지를 설치해주시면 됩니다.

$ pip install tqdm

1. iterable을 그냥 tqdm으로 넘기면 끝

  tqdm을 쓰는 법은 너무나 너무나 간단합니다. 반면에 그 효과는 아주 그럴듯하고요. 처리하려고 하는 iterable을 tqdm에 넘기기만 하면 됩니다. 위의 예제를 tqdm으로 한번 개선해보겠습니다.

  * iterable이 뭔지 익숙하지 않으시다면 python에서 list, str와 같이 요소를 하나씩 차근차근 처리할 수 있는 데이터라고 보시면 됩니다.

from tqdm import tqdm
import time

def heavy_job():
    time.sleep(0.05)
    return

for i in tqdm(range(100)):
    heavy_job()

 

  단 몇 글자를 추가했을 뿐인데, 진행률을 %, 그래프, 현재/전체데이터로 보여주고, 걸린 시간, 남은 예상시간, 초당 처리 항목으로 아름답게 표현해주죠. 이 정도면 정말 거저라고 말할 수밖에 없습니다. 가성비 최고죠.

2. 하지만 단위가 it/s ?

  자세히 보시면 Progress Bar 끝에 단위가 it/s입니다. tqdm 입장에서는 현재 무슨 데이터를 처리하는지 모르기 때문에 가장 일반적인 단위를 보여주는 것이고요. unit이라는 인자에 원하는 단위명을 주면 it/s를 단위명/s로 바꿀 수 있습니다.

from tqdm import tqdm
import time

def heavy_job():
    time.sleep(0.05)
    return

for i in tqdm(range(100), unit=" 항목"):
    heavy_job()

3. 뭐 하고 있는지 표시도 하고 싶다면

  기왕이면 다홍치마라고 지금 무슨 작업을 하는 중인지 표시하고 싶을 수도 있습니다. 이것도 아주 간단합니다. desc 인자에 설명을 추가해주기만 하면 됩니다.

from tqdm import tqdm
import time

def heavy_job():
    time.sleep(0.05)
    return

for i in tqdm(range(100), unit=" 항목", desc="전처리 중"):
    heavy_job()

 

4. 전체 처리해야 하는 항목 수를 모를 때는

  데이터를 다루다 보면 처리해야하는 전체 데이터를 수를 모를 때도 있습니다. 온라인 학습이라거나, Lazy loading 이 그럴 수 있습니다. 이때도 진행률을 알 수는 없지만 여전히 tqdm을 사용할 수는 있습니다. 전체 수를 알 수 있을 때보다는 덜하지만 그래도 꽤 유용한 통계들을 보여줍니다.

from tqdm import tqdm
import time

def heavy_job():    
    for i in range(100):
        time.sleep(0.05)
        yield i
    return    

for i in tqdm(heavy_job(), unit=" 항목", desc="전처리 중"):
    pass

 

5. 마치며

  파이썬에는 참 좋은 모듈들이 많지만 tqdm은 들이는 노력 대비 얻는 효과가 아주 큰 가성비 갑의 모듈이라고 할 수 있습니다. 지금 돌린 작업이 얼마큼 됐는지, 잘 돌아가고 있는지 이제 더 이상 고민하지 말고 tqdm과 함께 마음의 평안을 얻어 보아요.