Akashic Records

16.2 코드 최적화 기법 본문

Python for Beginners

16.2 코드 최적화 기법

Andrew's Akashic Records 2023. 5. 8. 10:23
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
Comments