백준 온라인 저지 1655번 문제의 파이썬 풀이입니다.
코딩테스트를 진행하다 보면 출력값이 굉장히 많아질 때가 있습니다. 그럴 때 출력하는 방법 중 가장 빠른 방법을 찾아봅니다.
파이썬의 time 모듈을 활용하여 진행했으며 동일한 list를 각각의 방법으로 print하고 수행하는데 걸린 시간을 계산하였습니다.
list는 -21억 ~ 21억 사이 임의의 정수로 구성되어있습니다.
Python에서 리스트를 출력하는 다양한 방법들이 있는데, 대표적인 방법들을 알아보겠습니다.
for 문을 통해 list의 각 element를 순회하며 print하는 방법입니다.
1
2
for number in output_list:
print(number)
파이썬의 * (Asterisk)를 사용한 방법입니다.
1
print(*output_list, sep='\n')
파이썬 str의 join 함수를 활용한 방법입니다.
1
print('\n'.join(map(str, output_list)))
output_list에 str 형식으로 들어있다면 map 함수는 필요 없습니다.
BENCHMARK_LENGTH 길이를 가진 output_list를 BENCHMARK_COUNT 번 반복해서 평균 시간을 계산한 결과입니다.
System Information
CPU: AMD Ryzen 7 5800H
RAM: 16GB
VER: Python 3.10
IDE: PyCharm Community Edition
BENCHMARK_LENGTH 가 작을 땐 서로 큰 차이가 없으나 LENGTH가 커지면 join의 성능이 좋은 것을 볼 수 있습니다.
결과적으로 str.join을 활용하는 것이 대부분의 상황에서 좋은 것으로 나타났고, 저 또한 출력이 많아질 경우 출력을 list에 임시 저장한 후 join하여 print하는 방식으로 진행하고 있습니다.
아래는 성능 측정에 사용한 코드입니다.
개선 사항이 있다면 댓글 혹은 메일 부탁드립니다. 감사합니다.
※ 도움이 되시길 바라며 replit에 코드를 올려놓았습니다.([코드][python-print-string-performance-replit])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import random
import time
BENCHMARK_COUNT = 10
BENCHMARK_LENGTH = 1000000
output_list = [random.randint(-210000000, 210000000) for _ in range(BENCHMARK_LENGTH)]
ast_time, join_time, foreach_time, for_time = 0, 0, 0, 0
for _ in range(BENCHMARK_COUNT):
start_time = time.time()
print(*output_list, sep='\n')
end_time = time.time()
ast_time += end_time - start_time
ast_time /= BENCHMARK_COUNT
for _ in range(BENCHMARK_COUNT):
start_time = time.time()
print('\n'.join(map(str, output_list)))
end_time = time.time()
join_time += end_time - start_time
join_time /= BENCHMARK_COUNT
for _ in range(BENCHMARK_COUNT):
start_time = time.time()
for number in output_list:
print(number)
end_time = time.time()
foreach_time += end_time - start_time
foreach_time /= BENCHMARK_COUNT
for _ in range(BENCHMARK_COUNT):
start_time = time.time()
for i in range(len(output_list)):
print(output_list[i])
end_time = time.time()
for_time += end_time - start_time
for_time /= BENCHMARK_COUNT
print()
print(f"number of benchmark : {BENCHMARK_COUNT}")
print(f"length of list : {BENCHMARK_LENGTH}")
print(f"total time (asterisk) : {ast_time}")
print(f"total time (join) : {join_time}")
print(f"total time (foreach) : {foreach_time}")
print(f"total time (for) : {for_time}")