본문 바로가기
코딩교육/Python 초등교육에서 전문가까지

2단계 : 4. 함수 (실행 시간 측정, 데이터 처리 및 알고리즘 최적화)

by 제리토리 2025. 3. 21.
728x90
반응형

 

1. 개요

 

Python은 강력한 데이터 처리 기능과 다양한 라이브러리를 제공하여 효율적인 프로그래밍을 가능하게 합니다. 본 글에서는 실행 시간 측정 데코레이터, 피보나치 수열 계산, 리스트 필터링, 문자열 단어 개수 카운팅, 행렬 전치, 소수 판별, 최소/최대값 찾기 등 다양한 기능을 Python 코드로 구현하는 방법을 설명합니다.

 

 

2. 실행 시간 측정 데코레이터 (@timer)

 

프로그램의 성능을 분석할 때 특정 함수의 실행 시간을 측정하는 것은 중요합니다. Python의 functools.wrapstime 모듈을 활용하여 실행 시간을 출력하는 데코레이터를 만들어 봅시다.

import time
import functools

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds")
        return result
    return wrapper

 

  • 이 데코레이터는 함수를 실행하기 전 start_time을 기록하고, 실행 후 end_time과 비교하여 실행 시간을 출력합니다.

  • @functools.wraps(func)를 사용하여 함수의 메타데이터를 유지합니다.

 

 

 

3. 피보나치 수열 계산 (메모이제이션 적용)

 

피보나치 수열은 재귀로 구현할 수 있지만, 중복 계산이 많아 성능이 저하될 수 있습니다. 이를 해결하기 위해 functools.lru_cache를 사용하여 메모이제이션을 적용합니다.

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

 

  • @functools.lru_cache(maxsize=None)를 사용하면 이전 계산 값을 저장하여 성능을 최적화할 수 있습니다.

  • fibonacci(30)을 실행하면 30번째 피보나치 수를 빠르게 계산할 수 있습니다.

 

 

 

4. 리스트에서 짝수만 필터링하는 함수

 

리스트에서 짝수만 추출하는 기능을 구현해 보겠습니다.

from typing import List

def filter_even_numbers(numbers: List[int]) -> List[int]:
    return list(filter(lambda x: x % 2 == 0, numbers))

 

  • filter()lambda를 활용하여 리스트에서 짝수만 추출합니다.

  • 예제 실행:

numbers = list(range(1, 21))
print("짝수 필터링 결과:", filter_even_numbers(numbers))

 

출력결과

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

 

 

5. 문자열을 단어 단위로 카운팅하는 함수

 

 

텍스트 내 단어 빈도를 계산하는 기능을 구현해 보겠습니다.

from typing import Dict

def word_count(text: str) -> Dict[str, int]:
    words = text.lower().split()
    word_freq = {}
    for word in words:
        word_freq[word] = word_freq.get(word, 0) + 1
    return word_freq

 

  • 입력된 문자열을 소문자로 변환한 후, 단어별 등장 횟수를 저장하는 딕셔너리를 생성합니다.

  • 예제 실행:

text = "Python is fun and Python is powerful"
print("단어 개수 결과:", word_count(text))

 

출력결과

{'python': 2, 'is': 2, 'fun': 1, 'and': 1, 'powerful': 1}

 

 

 

6. 2차원 리스트(행렬) 전치 함수

 

행렬을 전치(transpose)하는 방법을 알아보겠습니다.

from typing import List

def transpose_matrix(matrix: List[List[int]]) -> List[List[int]]:
    return list(map(list, zip(*matrix)))

 

  • zip(*matrix)를 이용하여 행과 열을 변환한 후 리스트로 변환합니다.

  • 예제 실행:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("전치 행렬 결과:", transpose_matrix(matrix))

 

출력결과

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

 

 

 

7. 소수 판별 함수

 

소수(prime number) 여부를 판별하는 함수입니다.

def is_prime(n: int) -> bool:
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

 

  • 2부터 √n까지 나누어지는지 확인하여 소수를 판별합니다.

  • 예제 실행:

primes = [n for n in range(1, 50) if is_prime(n)]
print("소수 리스트:", primes)

 

출력결과

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

 

 

 

8. 여러 개의 숫자를 받아서 최대값과 최소값 반환하는 함수

 

여러 개의 숫자를 입력받아 최소값과 최대값을 반환하는 함수를 작성합니다.

from typing import Tuple

def find_min_max(*args: int) -> Tuple[int, int]:
    return min(args), max(args)

 

  • 가변 인자(*args)를 받아 최소값과 최대값을 반환합니다.

  • 예제 실행:

min_val, max_val = find_min_max(10, 5, 20, 3, 8)
print(f"최소값: {min_val}, 최대값: {max_val}")

 

출력결과

최소값: 3, 최대값: 20

 

 

9. 코드 실행 테스트

 

이제 모든 기능을 실행해 보겠습니다.

if __name__ == "__main__":
    numbers = list(range(1, 21))
    print("짝수 필터링 결과:", filter_even_numbers(numbers))
    
    text = "Python is fun and Python is powerful"
    print("단어 개수 결과:", word_count(text))
    
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    print("전치 행렬 결과:", transpose_matrix(matrix))
    
    primes = [n for n in range(1, 50) if is_prime(n)]
    print("소수 리스트:", primes)
    
    min_val, max_val = find_min_max(10, 5, 20, 3, 8)
    print(f"최소값: {min_val}, 최대값: {max_val}")
    
    print("Fibonacci(30):", fibonacci(30))

 

 

10. 모든 코드 확인

 

import time
import functools
from typing import List, Dict, Tuple

# 실행 시간 측정 데코레이터
def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds")
        return result
    return wrapper

# 피보나치 수열 계산 (메모이제이션 적용)
@functools.lru_cache(maxsize=None)
def fibonacci(n: int) -> int:
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

# 리스트에서 짝수만 필터링하는 함수
def filter_even_numbers(numbers: List[int]) -> List[int]:
    return list(filter(lambda x: x % 2 == 0, numbers))

# 문자열을 단어 단위로 카운팅하는 함수
def word_count(text: str) -> Dict[str, int]:
    words = text.lower().split()
    word_freq = {}
    for word in words:
        word_freq[word] = word_freq.get(word, 0) + 1
    return word_freq

# 2차원 리스트(행렬) 전치 함수
def transpose_matrix(matrix: List[List[int]]) -> List[List[int]]:
    return list(map(list, zip(*matrix)))

# 소수 판별 함수
def is_prime(n: int) -> bool:
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

# 여러 개의 숫자를 받아서 최대값과 최소값 반환하는 함수
def find_min_max(*args: int) -> Tuple[int, int]:
    return min(args), max(args)

# 실행 테스트
if __name__ == "__main__":
    numbers = list(range(1, 21))
    print("짝수 필터링 결과:", filter_even_numbers(numbers))
    
    text = "Python is fun and Python is powerful"
    print("단어 개수 결과:", word_count(text))
    
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    print("전치 행렬 결과:", transpose_matrix(matrix))
    
    primes = [n for n in range(1, 50) if is_prime(n)]
    print("소수 리스트:", primes)
    
    min_val, max_val = find_min_max(10, 5, 20, 3, 8)
    print(f"최소값: {min_val}, 최대값: {max_val}")
    
    print("Fibonacci(30):", fibonacci(30))

 

출력결과

짝수 필터링 결과: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
단어 개수 결과: {'python': 2, 'is': 2, 'fun': 1, 'and': 1, 'powerful': 1}
전치 행렬 결과: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
소수 리스트: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
최소값: 3, 최대값: 20
Fibonacci(30): 832040

 

728x90
반응형