개요
파이썬 코테 스터디를 진행하던 도중 팀원의 sort(),sorted()에 대해 시간복잡도 차이가 난다고 했어요.
Timsort()를 이용해서 n log (n)의 안정된 시간 복잡도를 둘 다 사용하는데 왜 백준에서 실행을 했을 때
Timsort 알아보기 : https://d2.naver.com/helloworld/0315536
sort()만 정답처리가 됐는지 궁금해서 실험을 해봤습니다.
실험 결과
import time
import statistics
import random
import string
# 10회 비교
sorted_value = []
sort_value = []
for _ in range (10):
# 더미 데이터 생성
dummy_input_a = [f'{random.choice(string.ascii_lowercase)}{random.randint(1, 26)}person_' for _ in range(100)]
dummy_input_b = [f'{random.choice(string.ascii_lowercase)}{random.randint(1, 26)}person_' for _ in range(100)]
# 더미 데이터 사용
N, M = len(dummy_input_a), len(dummy_input_b)
a = set(dummy_input_a)
b = set(dummy_input_b)
sorted_start_time = time.time()
sorted_c = sorted(list(a & b))
sorted_end_time = time.time()
sorted_value.append(sorted_end_time - sorted_start_time)
sort_start_time = time.time()
c=list(a & b)
c.sort()
sort_end_time =time.time()
sort_value.append(sort_end_time - sort_start_time)
for i in range(10):
print("sorted : {:.15f}".format(sorted_value[i]),end = " ")
print("sort : {:.15f}".format(sort_value[i]))
if sorted_value[i] > sort_value[i]:
print("{:.2f} 배 \tsort_value 빠름".format(sorted_value[i] / sort_value[i]))
else:
print("{:.2f} 배 \tsorted_value 빠름".format(sort_value[i] / sorted_value[i]))
print('--------------------------------------------')
print("sorted avg : \t{:.15f}".format(statistics.mean(sort_value)))
print("sort avg : \t{:.15f}".format(statistics.mean(sorted_value)))
sort()함수가 1.5배정도 보통 빠른걸 볼 수 있었어요
---------------------------------------------------------------------
sorted : 0.000015020370483 sort : 0.000007152557373 2.10 배 sort_value 빠름
sorted : 0.000010728836060 sort : 0.000006675720215 1.61 배 sort_value 빠름
sorted : 0.000009775161743 sort : 0.000005006790161 1.95 배 sort_value 빠름
sorted : 0.000010013580322 sort : 0.000006198883057 1.62 배 sort_value 빠름
sorted : 0.000009775161743 sort : 0.000006198883057 1.58 배 sort_value 빠름
sorted : 0.000011444091797 sort : 0.000007152557373 1.60 배 sort_value 빠름
sorted : 0.000012874603271 sort : 0.000008583068848 1.50 배 sort_value 빠름
sorted : 0.000010967254639 sort : 0.000006914138794 1.59 배 sort_value 빠름
sorted : 0.000011205673218 sort : 0.000007629394531 1.47 배 sort_value 빠름
sorted : 0.000011205673218 sort : 0.000007390975952 1.52 배 sort_value 빠름
---------------------------------------------------------------------
정렬 속도 비교된 사이트
https://www.acmicpc.net/blog/view/58
여기서도 일반적으로 sort()가 sorted()보다 빠르다는 것을 알 수 있었어요
PyPy3 sort() < PyPy3 sorted() < python 3 sort() < python 3 sorted()
순서로 빠르기가 나온다고 하네요
같은 코드 다른 결과
같은 코드를 제출해도 백준 서버 상황에 따라 시간 초과가 날 수도 안날 수도 있다고 합니다
위에 보면 맨 아래 코드랑 맨위 1,2번은 같은 코드에요 같은 코드여도 실행 속도에는 차이가 있어요
그런데 시간제한이 2초인데 왜 ? 4초 가까이인데 통과일까요?
백준의 보너스 시간
C언어랑 Python이랑 같은 시간 제한을 두면 python은 거의 통과를 못할거에요
그래서 보너스 시간이라는 개념이 존재한다고 해요
https://help.acmicpc.net/language/info
Python, PyPy3은 시간제한이 3배+2초 -> 2초면 8초까지 보너스 시간제한
일반적으로 sort()가 더 빠르다는 사실은 알게됐네요 :)
'Coding test' 카테고리의 다른 글
99클럽 코테 스터디 1일차 TIL, 프로그래머스 / 뒤에 있는 큰수 (3) | 2024.07.22 |
---|---|
[백준/14499/파이썬] 주사위 굴리기 - 구현 (0) | 2024.04.09 |
[프로그래머스/파이썬/가장 큰 정사각형 구하기] (0) | 2024.03.09 |
[프로그래머스/Lv.1/파이썬] 비밀지도 (0) | 2024.03.08 |
[프로그래머스/Lv.1/파이썬] 다트게임 (0) | 2024.03.08 |