본문 바로가기
Python for Beginners

16.2 코드 최적화 기법

by Andrew's Akashic Records 2023. 5. 8.
728x90

코드 최적화란 코드의 실행 속도를 높이고 메모리 사용량을 줄이는 과정입니다. 파이썬에서 코드 최적화 기법을 적용하면 프로그램의 성능을 향상시킬 수 있습니다. 여기에 몇 가지 코드 최적화 기법과 예시를 소개합니다.

1. 루프 최적화: 루프는 프로그램의 실행 시간에 큰 영향을 미치는 요소입니다. 루프의 개수를 줄이거나 내부 연산을 최적화하면 성능이 향상됩니다.

예시코드:

# 최적화 전
result = []
for i in range(100):
    if i % 2 == 0:
        result.append(i * i)

# 최적화 후
result = [i * i for i in range(0, 100, 2)]


2. 내장 함수 사용: 파이썬 내장 함수는 일반적으로 C로 구현되어 있어 빠른 실행 속도를 제공합니다. 가능한 경우 내장 함수를 사용하십시오.

예시코드:

# 최적화 전
def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n - 1)

# 최적화 후
import math
math.factorial(5)


3. 불필요한 연산 최소화: 필요하지 않은 연산은 코드의 실행 시간을 늘리고 메모리를 낭비합니다. 불필요한 연산을 제거하십시오.

예시코드:

# 최적화 전
squares = [i * i for i in range(100)]
squares_sum = sum(squares)

# 최적화 후
squares_sum = sum(i * i for i in range(100))


4. 자료 구조 선택: 적절한 자료 구조를 선택하여 연산 속도를 높일 수 있습니다. 예를 들어, 파이썬에서는 `dict`와 `set`이 검색에 빠르므로 가능한 경우 이들을 사용하십시오.

예시코드:

# 최적화 전
names = ["Alice", "Bob", "Charlie"]
if "Alice" in names:
    print("Found Alice")

# 최적화 후
names = {"Alice", "Bob", "Charlie"}
if "Alice" in names:
    print("Found Alice")


5. 함수 호출 최소화: 함수 호출은 오버헤드가 발생할 수 있으므로, 필요한 경우에만 함수를 호출하십시오.

예시코드:

# 최적화 전
result = sum([i * i for i in range(100)])

# 최적화 후
result = sum(i * i for i in range(100))

이러한 최적화 기법을 적용하면 파이썬 코드의 실행 속도를 높일 수 있습니다. 그러나 최적화를 적용하기 전에 프로파일링을 수행하여 코드의 병목 현상을 파악하고, 어떤 부분이 최적화가 필요한지를 판단해야 합니다. 또한, 코드 최적화를 과도하게 적용하면 코드의 가독성이 떨어질 수 있으므로 적절한 수준의 최적화를 고려해야 합니다.

6. 로컬 변수 사용: 전역 변수보다 로컬 변수에 접근하는 것이 빠릅니다. 가능한 경우 함수 내부에서 로컬 변수를 사용하십시오.

예시코드:

# 최적화 전
global_var = 5
def calculate(x):
    return x * global_var

# 최적화 후
def calculate(x, var):
    return x * var

global_var = 5
calculate(10, global_var)


7. 캐시 사용: 중복되는 계산 결과를 캐시에 저장하여 불필요한 연산을 줄일 수 있습니다. 특히, 재귀 함수에서는 메모이제이션 기법을 사용하여 중복 계산을 피할 수 있습니다.

예시코드:

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

fibonacci(100)


8. 병렬 처리: 병렬 처리를 사용하면 CPU 코어를 최대한 활용하여 코드의 실행 속도를 높일 수 있습니다. `concurrent.futures`와 같은 라이브러리를 사용하여 병렬 처리를 구현할 수 있습니다.

예시코드:

import concurrent.futures
import math

def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

numbers = [i for i in range(2, 100000)]

with concurrent.futures.ThreadPoolExecutor() as executor:
    primes = list(executor.map(is_prime, numbers))

print(sum(primes))


코드 최적화 기법을 사용할 때는 가독성과 성능 간의 균형을 고려해야 합니다. 최적화된 코드는 실행 속도가 빠르지만, 가독성이 떨어질 수 있으므로 적절한 수준의 최적화를 선택하는 것이 중요합니다.

728x90