프로그래밍/Python

파이썬(Python) 속도 최적화: 주요 모든 전략 (+코드)

프리다이어비티즈 2024. 10. 15. 09:00
반응형

목차

    파이썬 속도 최적화 전략에 대해 알아보겠습니다. 이 글에서는 몇 가지 주요 속도 최적화 방법과 각 전략에 대한 구체적인 예시 코드를 제공하여 파이썬 코드 성능을 개선하는 데 도움이 되도록 하겠습니다.

    공지

    본 포스팅의 무단도용 및 배포를 금지합니다.

    1. 코드 프로파일링 (Profiling)

    반응형

    코드를 최적화하려면 어디서 시간이 많이 소모되는지 알아야 합니다. 이를 위해 cProfile을 사용할 수 있습니다.

    import cProfile
    import time
    
    def slow_function():
        time.sleep(2)
    
    def fast_function():
        return sum(range(10000))
    
    cProfile.run('slow_function()')
    cProfile.run('fast_function()')

    위 코드는 slow_function과 fast_function의 실행 시간을 보여줍니다. 어떤 부분에서 최적화가 필요한지 확인하는 데 유용합니다.

    2. 리스트 컴프리헨션 (List Comprehension)

    리스트 컴프리헨션은 파이썬의 성능을 향상시키는 효과적인 방법 중 하나입니다. 반복문을 사용하는 것보다 빠르게 리스트를 생성할 수 있습니다.

    # 일반적인 반복문을 사용한 방식
    numbers = []
    for i in range(10000):
        numbers.append(i * 2)
    
    # 리스트 컴프리헨션을 사용한 방식
    numbers = [i * 2 for i in range(10000)]

    리스트 컴프리헨션 방식이 더 간결하고 빠릅니다. 특히 대량의 데이터 처리를 할 때 그 차이가 큽니다.

     

    3. 다중 스레딩/프로세싱 (Multithreading/Multiprocessing)

    멀티스레딩이나 멀티프로세싱을 사용하면 CPU 바운드 작업이나 I/O 바운드 작업의 성능을 크게 향상시킬 수 있습니다.

    import threading
    import time
    
    def task():
        time.sleep(2)
        print("Task completed")
    
    threads = []
    for _ in range(5):
        thread = threading.Thread(target=task)
        threads.append(thread)
        thread.start()
    
    for thread in threads:
        thread.join()

    위 코드는 여러 스레드를 사용하여 작업을 동시에 수행합니다. I/O 바운드 작업의 경우 멀티스레딩이 유용합니다.

     

    4. 벡터화 (Vectorization) - NumPy 활용

    벡터화를 통해 반복문을 대체하면 코드의 성능을 크게 향상시킬 수 있습니다. NumPy는 이러한 벡터화를 쉽게 구현할 수 있는 라이브러리입니다.

    import numpy as np
    
    # 일반적인 반복문을 사용한 방식
    numbers = list(range(10000))
    result = [x * 2 for x in numbers]
    
    # NumPy 벡터화를 사용한 방식
    numbers = np.array(range(10000))
    result = numbers * 2

    NumPy의 벡터화는 반복문을 사용하는 것보다 훨씬 빠르며, 특히 대규모 데이터 처리에서 큰 차이를 보입니다.

     

    5. 내장 함수 사용

    파이썬의 내장 함수는 최적화되어 있어, 동일한 작업을 수행할 때 직접 구현한 코드보다 훨씬 빠른 경우가 많습니다.

    # 직접 구현한 방식
    def custom_sum(numbers):
        total = 0
        for number in numbers:
            total += number
        return total
    
    numbers = range(10000)
    print(custom_sum(numbers))
    
    # 내장 함수를 사용한 방식
    print(sum(numbers))

    내장 함수 sum을 사용하는 것이 더 간단하고 빠릅니다. 가능하다면 항상 내장 함수를 사용하는 것이 좋습니다.

    6. 불필요한 객체 생성을 피하기

    반복적인 객체 생성은 메모리를 낭비하고 성능을 저하시키므로 피하는 것이 좋습니다.

    # 비효율적인 방식
    def create_strings():
        result = []
        for _ in range(10000):
            result.append(str(_))
        return result
    
    # 효율적인 방식
    from itertools import repeat
    
    def create_strings_efficient():
        result = list(map(str, repeat(None, 10000)))
        return result

    불필요한 객체 생성을 피하고, 필요에 따라 반복적인 작업을 최적화하여 메모리와 성능을 개선할 수 있습니다.


    이상으로 몇 가지 파이썬 속도 최적화 전략을 살펴보았습니다. 코드를 작성할 때는 항상 효율성을 염두에 두고, 프로파일링을 통해 성능 병목이 어디에 있는지 파악하여 최적화를 진행하는 것이 좋습니다.

    반응형