인트로

tqdm을 쓰면 느려지는 것 같아서 자신은 잘 안쓴다는 선생님의 말씀을 듣고,
실제로 그러한지에 대한 테스트를 해본다.


사용 개념 : \r

tqdm을 살펴보면, 진행률을 한 줄로 표시함을 볼 수 있다.
그러므로 필요한 기술은, 연속된 출력에서 이전 출력 내용을 지우고 업데이트 하는 것.
간단한 기술로 가능한데, 바로 print 메서드에 \r정규표현식을 이용하는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 그냥 print 사용해보기
print('1번입니다', end='')
print('2번입니다', end='')
-----------출력-----------
1번입니다2번입니다

# \r을 사용해 이전 출력내용 지우기
print('1번입니다', end='')
print('\r2번입니다', end='')
-----------출력-----------
2번입니다.

===> 1번입니다는 삭제되고, 2번입니다만 출력됨

  • \r 정규표현식 : 앞쪽 출력물을 지운다.
  • end = ‘’ : 줄바꿈 하지 않음. print의 파라미터로, 기본값은 ‘\n’(줄바꿈)으로 되어있다.



표현법 기초공사

1차 : 진행률 %로 표기해보기

1회 ~ 100회 동안 각 회마다 진행률%를 출력하도록 했다.
time.sleep을 이용해 0.1초 간격을 두고 각 회차가 진행된다.

1
2
3
4
5
import time

for i in range(101):
    print(f'\r{i}%', end='')
    time.sleep(0.1)


2차 : 진행률을 input num과 매칭하여 진행률 표기하기

진행 횟수인 fit_num에 대해 %로 표기를 할 수 있게끔
(현재 진행횟수 / fit_num * 100)의 반올림 값을 표기하게 한다.

1
2
3
4
5
6
import time
fit_num = 51

for i in range(fit_num):
    print(f'\r{round(i/(fit_num-1)*100)}%', end='')
    time.sleep(0.1)


3차 : 좀 더 예쁘게 디자인해보기

진행된만큼 네모칸이 채워지는 프로그레스바를 만들어보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time
fit_num = 101

for i in range(fit_num):
    
    n = round(i / ((fit_num-1)//10))
    k = 10 - n
    m = 1 if k > 0 else 0
    
    print(f'\r{round(i/(fit_num-1)*100)}%',
          '|',
          '■ ' * n, '>' * m, ' .' * (k-1),
          '|',
          end='')
    
    time.sleep(0.1)



To Do

실제 함수에 적용하기까지는 무리가 있다.
이후 보강 필요

레퍼런스

https://jellyho.com/blog/96/