๐ ๋ณธ ๊ฒ์๊ธ์ Python 3.11.0 ํ๊ฒฝ์์ ์์ฑ๋์์ต๋๋ค!
ํ์ด์ฌ์ ์ธํฐํ๋ฆฌํฐ ์ธ์ด๋ก ์๋ ค์ ธ ์์ง๋ง ์ฌ์ค์ ํ์ด๋ธ๋ฆฌ๋ ์ธ์ด๋ก ๋ณผ ์ ์๋ค.
๊ทธ ์ด์ ๋ ๋์ ๋ฐฉ์์ ๋ณด๋ฉด ์ ์ ์๋ค.
ํ์ด์ฌ ์ฝ๋๊ฐ ๋์ํ๋ ๋ฐฉ์์ ๋ณด๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ Python Source Code๋ฅผ Python Interpreter์ ์ ๋ฌํ๋ฉด ๋ด๋ถ์์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ์งํ๋๋ค.
- Python Complier๊ฐ ํ์ด์ฌ ์์ค ์ฝ๋๋ฅผ ์ฝ๊ณ ๋ฌธ๋ฒ ๊ฒ์ฌ ํ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํ ํ๋ค.
- PVM(Python Virtual Machine)์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ํ์ค์ฉ ๋ฒ์ญํ๋ค.
์ด๋ฐ ๊ณผ์ ์ด ๋๋ ํ ์ปดํจํฐ๋ ๋ฒ์ญ๋ ๊ธฐ๊ณ์ด๋ฅผ ์คํํ๋ค.
Python Compiler๊ฐ ๋ณํํ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ๋ก์ ํธ์์ ๋ณผ ์ ์๋๋ฐ ๋ฐ๋ก __pycache__๋ผ๋ ํด๋์ .pyc์ด ์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋ ์ด๋ค.
ํ์ด์ฌ์ ์ด๋ ๋ฏ ์์ค์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ง๋๋ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ C,C++, ์ด์ ํ๋ฆฌ์ด ๊ฐ์ ์ ๊ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ณด๋ค๋ ๋๋ฆด ์ ๋ฐ์ ์๋ค.
ํ์ง๋ง ํ์ด์ฌ์ ์ฝ๋ฉ์ ํ๋ค๋ณด๋ฉด ์ฑ๋ฅ ํฅ์์ด ํ์ํ ๋๊ฐ ์๋ค. ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ํตํด ์ฑ๋ฅ ํฅ์์ ์๋ํด ๋ณผ ์ ์๋ค.
- ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ: ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์คํธ ๋์ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต ์ ๊ฑฐํ ๋ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
- ๋ด์ฅ ํจ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ: Python์ ๋ด์ฅ ํจ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: NumPy, Pandas)๋ฅผ ํ์ฉํ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ ์ ์๋ค.
- ์ฝ๋ ํ๋กํ์ผ๋ง: cProfile๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์ ์ฐพ์ ์ต์ ํํ ์ ์๋ค.
- ๋ณ๋ ฌ ์ฒ๋ฆฌ: ๋ฉํฐ์ค๋ ๋ฉ์ด๋ ๋ฉํฐํ๋ก์ธ์ฑ์ ํตํด CPU์ ์ฌ๋ฌ ์ฝ์ด๋ฅผ ํ์ฉํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค.
- JIT ์ปดํ์ผ๋ฌ ์ฌ์ฉ: PyPy์ ๊ฐ์ JIT(JIT Compilation) ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ์๋๋ฅผ ๋์ผ ์ ์๋ค.
์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๊ฐ์
์ ์ ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด Python ์ฝ๋์ ์คํ ์๋๋ฅผ ๋ํ ์ ์๋ค.
๋ํ์ ์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํ ๋, ๋ฐ๋ณต๋ฌธ์ ํตํด append ํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ (List Comprehension) ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฉด ๋ ๋น ๋ฅด๋ค.
import time
if __name__ == "__main__":
start = time.time()
a = []
for i in range(100000000):
a.append(i)
end = time.time()
print(f"Default : {end-start:.4f}sec")
start = time.time()
a = [i for i in range(100000000)]
end = time.time()
print(f"List Comprehension : {end-start:.4f}sec")
์ด๋ ๊ฒ ์๋์ฐจ์ด๊ฐ ๋๋ ์ด์ ๋ ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์ด ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ ๋ฆฌ์คํธ๋ฅผ ์์ฑํด์ผ ํ ๋๋ ๋ฆฌ์คํธ(ํํ, ์งํฉ, ์ฌ์ ) ์ปดํ๋ฆฌํจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์ถ๊ฐ๋ก ์ฐ์ฐ์ ๋ฐ๋ณตํ ๋๋ ๋ง์ฐฌ๊ฐ์ง ์ด๋ค.
import time
if __name__ == "__main__":
start = time.time()
a = 0
for i in range(1000000):
a+=i
print(a)
end = time.time()
print(f"Default : {end-start:.4f}sec")
start = time.time()
a = list(range(1000000))
a = sum(a)
print(a)
end = time.time()
print(f"SUM : {end-start:.4f}sec")
sum์ด ๋ ๋น ๋ฅธ ์ด์ ๋ C๋ก ์ต์ ํ๋ ๋ด๋ถ ๊ตฌํ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํน์ ๋ฌธ์ ์ ๋ํด์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ค ๊ฒ์ ์ ํํ๋๋์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๋ค.
๋ค์์ ๊ทธ๋ํ์ ๋ํด A -> N๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๋๋ค ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ง ๋ชฉํ ๋ ธ๋๊ฐ ๊น์ ๊ณณ์ ์์นํ๋ฏ๋ก DFS ์ข ๋ ๋น ๋ฅด๋ค. (๋น๊ต๋ฅผ ์ํด ์ธ์์ ์ผ๋ก ๋์ผํ ๋๊ธฐ์๊ฐ ๋ถ์ฌ)
import time
from collections import deque
# BFS ๊ตฌํ
def bfs(graph, start, goal):
visited = set()
queue = deque([(start, [start])]) # (ํ์ฌ ๋
ธ๋, ๊ฒฝ๋ก)
while queue:
current_node, path = queue.popleft()
time.sleep(0.1)
if current_node == goal:
return path
for neighbor in graph[current_node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, path + [neighbor]))
return None # ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ
# DFS ๊ตฌํ
def dfs(graph, start, goal, path=None):
if path is None:
path = []
path.append(start)
time.sleep(0.1)
if start == goal:
return path
for neighbor in graph[start]:
if neighbor not in path:
result = dfs(graph, neighbor, goal, path)
if result is not None:
return result
path.pop()
return None
if __name__ =="__main__":
graph = {
'A': ['B', 'C', 'D'],
'B': ['A', 'E', 'F'],
'C': ['A', 'G', 'H'],
'D': ['A', 'I', 'J'],
'E': ['B', 'K', 'L'],
'F': ['B'],
'G': ['C'],
'H': ['C', 'M', 'N'],
'I': ['D'],
'J': ['D'],
'K': ['E'],
'L': ['E'],
'M': ['H'],
'N': ['H'],
}
# ๋ ๋ง์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ์ฌ ๊ทธ๋ํ๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
for i in range(15, 30):
graph[chr(65 + i)] = [chr(65 + i - 1), chr(65 + i - 2)] # A-Z๊น์ง ๋
ธ๋ ์ถ๊ฐ
# ๊ฒฝ๋ก ์ฐพ๊ธฐ์ ์๊ฐ ์ธก์
start_node = 'A'
goal_node = 'N'
# BFS ์๊ฐ ์ธก์
start_time_bfs = time.time()
bfs_path = bfs(graph, start_node, goal_node)
end_time_bfs = time.time()
bfs_time = end_time_bfs - start_time_bfs
# DFS ์๊ฐ ์ธก์
start_time_dfs = time.time()
dfs_path = dfs(graph, start_node, goal_node)
end_time_dfs = time.time()
dfs_time = end_time_dfs - start_time_dfs
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("BFS๋ก ์ฐพ์ A์์ N๋ก ๊ฐ๋ ๊ฒฝ๋ก:", bfs_path)
print(f"BFS ์คํ ์๊ฐ:{bfs_time:.7f}")
print("DFS๋ก ์ฐพ์ A์์ N๋ก ๊ฐ๋ ๊ฒฝ๋ก:", dfs_path)
print(f"DFS ์คํ ์๊ฐ:{dfs_time:.7f}")
'Langauge > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ์ฐ์ฐ ์๋ ์ฌ๋ฆฌ๊ธฐ - ํ๋กํ์ผ๋ง(Profiling) (0) | 2024.09.13 |
---|---|
[Python] ์ฐ์ฐ ์๋ ์ฌ๋ฆฌ๊ธฐ - ๋ด์ฅ ํจ์ ์ฌ์ฉ (0) | 2024.09.13 |
[Python] 8. ํ์ผ ์ฒ๋ฆฌ (0) | 2023.02.11 |
[Python] 7. ์์ธ์ฒ๋ฆฌ (0) | 2023.02.11 |
[Python] 6. ํด๋์ค์ ๋ชจ๋ (0) | 2023.02.11 |