파이썬 코딩

[Python] For Loop 진행률 나타내기: tqdm

sungjunkim 2021. 4. 11. 20:09

반복적인 작업을 for loop을 통해서 진행할 때 횟수가 많아지고 작업 자체의 계산량이 많을 경우 코드에 따라 몇 분에서 몇 시간까지 걸리는 경우가 있다. 특히 Monte Carlo 시뮬레이션 같이 1,000개에서 10,000개의 샘플을 통한 해석을 할 경우 며칠이 걸리는 경우도 있다. 이럴 때 가만히 빈 커맨드 창을 보기보다는 프로그램 설치할 때처럼 진행률을 볼 수 있다면 인내력이 다소 높아질 수 있을 것이다.

 

이번 포스트에서는 'tqdm'이라는 라이브러리를 활용해 진행 현황을 나타내는 코드를 소개한다. 이미 잘 알려진 방법이긴 하나, 블로그 내에서 노트해 둘 겸 정리해보았다. 참고로 tqdm의 이름은 아랍어로 '진행률'을 뜻하는 'taqaddum'에서 유래됐다고 한다. 

 

tqdm 라이브러리 설치 및 불러오기

먼저 pip으로 tqdm 라이브러리를 설치한다. 

 

1
pip install tqdm
cs

 

설치 후 코드에서 다음과 같이 라이브러리를 불러온다. (trange는 이후에 tqdm과의 차이를 설명해주겠다)

 

1
from tqdm import tqdm, trange
cs

 

 

2개의 nested loop에서의 사용: tqdm, trange

tqdm 라이브러리 내에서 tqdm과 trange는 둘 다 같은 기능이긴 하지만, 사소한 깔끔함을 추구하는 분들에게 취향이 갈릴 것 같다. tqdm을 사용한다면 다음과 같이 코딩하면 된다. 

 

1
2
3
for i in tqdm(range(100)):
    for j in tqdm(range(100)):
        (반복할 코드)
cs

 

For loop이 하나라면 예상한 대로 진행률이 하나의 bar로 나타날 것이다. 본인은 2개의 nested loop을 자주 접해서 먼저 터미널(맥에서의 커맨드 프롬프트)에서 실행해봤다. 오른쪽 괄호에는 loop 하나의 계산 시간을 나타낸다. 

 

아래에서 두 번째 줄이 첫 번째(i) for loop의 진행 상황이며 마지막 줄이 두 번째(j) for loop이다

 

다음은 trange를 사용해봤다. trange가 기존의 'for __ in range(__)'와 유사한 느낌에 왠지 더 깔끔한 느낌이라 개인적으로 선호한다. 

 

1
2
3
for i in trange(100):
    for j in trange(100):
        (반복할 코드)
cs

 

기능 자체는 같다

 

Jupyter에서의 사용: tqdm.notebook

같은 코드를 Jupyter에서 사용하면 다음과 같이 조금 딱딱한 모습으로 진행률을 나타내준다. 

 

Jupyter에서 그냥 tqdm을 사용하면 보다시피 별로다

 

Jupyter에서 이쁘게 사용하려면 'tqdm.notebook'에서 tqdm을 불러와 사용한다. 

 

1
2
3
4
5
from tqdm.notebook import tqdm
 
for i in tqdm(range(100)):
    for j in tqdm(range(100)):
        (반복할 코드)
cs

Jupyter 환경에 어울리는 이쁜 진행률 bar로 보여준다

 

tqdm 내 여러 옵션들: 

tqdm에는 다양한 옵션들이 있는데 이 중 유용한 옵션 두 가지를 소개한다. 

  • desc: 해당 loop의 제목을 정해서 나타낼 수 있다. 
  • leave: 기본값은 True인데 이걸 False로 설정하면 위에서 loop마다 새로운 줄에서 진행률을 보여주는 것을 방지한다. 

desc와 leave 설정 시 더 깔끔한 loop을 보여준다. 

 

코드에 for loop이 많아지는 건 좋지 않지만, 피할 수 없는 상황에 자체적으로 계산량까지 많다면 한 번 써보길 권한다. 코드를 실행해두고 잠시 자리를 비운 사이 누군가 화면을 봤을 때 괜히 멋스럽게 보일 수도. 

 

출처: https://github.com/tqdm/tqdm