>백엔드 개발 >파이썬 튜토리얼 >더 빠른 코드를 위한 강력한 Python 성능 최적화 기술

더 빠른 코드를 위한 강력한 Python 성능 최적화 기술

Linda Hamilton
Linda Hamilton원래의
2024-12-14 10:53:10555검색

owerful Python Performance Optimization Techniques for Faster Code

Python 개발자로서 저는 코드 최적화가 고성능 애플리케이션을 만드는 데 중요하다는 것을 배웠습니다. 이 기사에서는 실행 속도와 메모리 효율성을 향상시키는 실용적인 방법에 중점을 두고 Python 코드 성능을 향상시키기 위해 사용한 7가지 강력한 기술을 공유하겠습니다.

생성자와 반복자

Python 코드를 최적화하는 가장 효과적인 방법 중 하나는 생성기와 반복기를 사용하는 것입니다. 이러한 도구는 모든 것을 메모리에 한 번에 로드하지 않고도 데이터를 처리할 수 있으므로 대규모 데이터 세트로 작업할 때 특히 유용합니다.

너무 커서 메모리에 편안하게 들어갈 수 없는 시퀀스로 작업해야 할 때 생성기를 자주 사용합니다. 다음은 소수를 생성하는 생성기 함수의 예입니다.

def prime_generator():
    yield 2
    primes = [2]
    candidate = 3
    while True:
        if all(candidate % prime != 0 for prime in primes):
            primes.append(candidate)
            yield candidate
        candidate += 2

이 생성기를 사용하면 모든 소수를 메모리에 저장하지 않고도 무한한 소수 시퀀스로 작업할 수 있습니다. 다음과 같이 사용할 수 있습니다.

primes = prime_generator()
for _ in range(10):
    print(next(primes))

목록 이해 및 생성기 표현식

목록 이해 및 생성기 표현식은 간결하고 종종 기존 루프에 대한 더 빠른 대안입니다. 이는 새 목록을 생성하거나 시퀀스를 반복하는 데 특히 유용합니다.

다음은 짝수를 제곱하는 List Comprehension의 예입니다.

numbers = range(10)
squared_evens = [x**2 for x in numbers if x % 2 == 0]

대규모 시퀀스의 경우 메모리 절약을 위해 생성기 표현식을 선호합니다.

numbers = range(1000000)
squared_evens = (x**2 for x in numbers if x % 2 == 0)

고성능 컨테이너 데이터 유형

Python의 컬렉션 모듈은 코드 효율성을 크게 향상시킬 수 있는 여러 가지 고성능 컨테이너 데이터 유형을 제공합니다.

목록의 양쪽 끝에서 빠른 추가 및 팝이 필요할 때 종종 deque(양단 큐)를 사용합니다.

from collections import deque

queue = deque(['a', 'b', 'c'])
queue.append('d')
queue.appendleft('e')

카운터는 해시 가능한 객체를 계산하는 데 유용한 또 다른 데이터 유형입니다.

from collections import Counter

word_counts = Counter(['apple', 'banana', 'apple', 'cherry'])

빠른 조회를 위한 세트 및 사전

세트와 사전은 내부적으로 해시 테이블을 사용하므로 조회 및 멤버십 테스트가 매우 빠릅니다. 컬렉션에 항목이 있는지 확인해야 할 때나 목록에서 중복 항목을 제거해야 할 때마다 사용합니다.

다음은 빠른 멤버십 테스트를 위해 세트를 사용하는 예입니다.

numbers = set(range(1000000))
print(500000 in numbers)  # This is much faster than using a list

Numba를 이용한 적시 편집

수치 계산의 경우 Numba는 적시 컴파일을 통해 상당한 속도 향상을 제공할 수 있습니다. 다음은 만델브로 집합을 계산하는 함수의 속도를 높이기 위해 Numba를 사용하는 예입니다.

from numba import jit
import numpy as np

@jit(nopython=True)
def mandelbrot(h, w, maxit=20):
    y, x = np.ogrid[-1.4:1.4:h*1j, -2:0.8:w*1j]
    c = x + y*1j
    z = c
    divtime = maxit + np.zeros(z.shape, dtype=int)

    for i in range(maxit):
        z = z**2 + c
        diverge = z*np.conj(z) > 2**2
        div_now = diverge & (divtime == maxit)
        divtime[div_now] = i
        z[diverge] = 2

    return divtime

이 함수는 순수 Python 함수보다 최대 100배 더 빠를 수 있습니다.

C-Speed를 위한 Cython

더 빠른 속도가 필요할 때는 Cython을 사용합니다. Cython을 사용하면 Python 코드를 C로 컴파일할 수 있어 성능이 크게 향상됩니다. 다음은 Cython 함수의 간단한 예입니다.

def prime_generator():
    yield 2
    primes = [2]
    candidate = 3
    while True:
        if all(candidate % prime != 0 for prime in primes):
            primes.append(candidate)
            yield candidate
        candidate += 2

이 Cython 함수는 순수 Python 구현보다 몇 배 더 빠를 수 있습니다.

프로파일링 및 최적화

최적화하기 전에 병목 현상이 발생하는 위치를 식별하는 것이 중요합니다. 타이밍 분석에는 cProfile을, 메모리 사용량 분석에는 memory_profiler를 사용합니다.

cProfile을 사용하는 방법은 다음과 같습니다.

primes = prime_generator()
for _ in range(10):
    print(next(primes))

메모리 프로파일링의 경우:

numbers = range(10)
squared_evens = [x**2 for x in numbers if x % 2 == 0]

이러한 도구는 가장 큰 영향을 미칠 수 있는 최적화 작업에 집중하는 데 도움이 됩니다.

functools.lru_cache로 메모하기

메모이제이션은 비용이 많이 드는 함수 호출의 결과를 캐시하는 데 사용하는 기술입니다. functools.lru_cache 데코레이터를 사용하면 이 작업이 쉬워집니다.

numbers = range(1000000)
squared_evens = (x**2 for x in numbers if x % 2 == 0)

이를 통해 중복 계산을 방지하여 재귀 함수의 속도를 획기적으로 높일 수 있습니다.

itertools를 사용한 효율적인 반복

itertools 모듈은 반복자 생성을 위한 빠르고 메모리 효율적인 도구 모음을 제공합니다. 시퀀스 결합이나 순열 생성과 같은 작업에 자주 사용합니다.

다음은 itertools.combinations 사용 예입니다.

from collections import deque

queue = deque(['a', 'b', 'c'])
queue.append('d')
queue.appendleft('e')

고성능 Python 코드 작성을 위한 모범 사례

수년에 걸쳐 저는 효율적인 Python 코드 작성을 위한 몇 가지 모범 사례를 개발했습니다.

  1. 루프 최적화: 가능한 한 많은 코드를 루프 외부로 이동하려고 노력합니다. 중첩 루프의 경우 내부 루프가 최대한 빠른지 확인합니다.

  2. 함수 호출 오버헤드 줄이기: 자주 호출되는 매우 작은 함수의 경우 인라인 함수나 람다 표현식 사용을 고려합니다.

  3. 적절한 데이터 구조 사용: 나는 작업에 적합한 데이터 구조를 선택합니다. 예를 들어 빠른 멤버십 테스트를 위해 세트를 사용하고 빠른 키-값 조회를 위해 사전을 사용합니다.

  4. 객체 생성 최소화: 특히 루프 내부에서 새 객체를 생성하는 데 비용이 많이 들 수 있습니다. 가능하면 물건을 재사용하려고 노력합니다.

  5. 내장 함수 및 라이브러리 사용: Python의 내장 함수 및 표준 라이브러리는 사용자 정의 구현보다 최적화되고 빠른 경우가 많습니다.

  6. 전역 변수 피하기: 전역 변수에 액세스하는 것이 지역 변수에 액세스하는 것보다 느립니다.

  7. 멤버십 테스트에 'in' 사용: 목록, 튜플, 세트의 경우 'in'을 사용하는 것이 루프보다 빠릅니다.

다음은 이러한 몇 가지 관행을 통합한 예입니다.

from collections import Counter

word_counts = Counter(['apple', 'banana', 'apple', 'cherry'])

이 함수는 키가 존재하는지 명시적으로 확인하지 않기 위해 defaultdict를 사용하고 단일 루프에서 데이터를 처리하며 최종 계산에 사전 이해를 사용합니다.

결론적으로 Python 코드 최적화는 연습과 경험이 필요한 기술입니다. 이러한 기술을 적용하고 항상 최적화의 영향을 측정함으로써 우아할 뿐만 아니라 성능도 뛰어난 Python 코드를 작성할 수 있습니다. 성급한 최적화는 모든 악의 근원이라는 점을 기억하십시오. 따라서 항상 최적화가 정말로 필요한 부분을 식별하기 위해 먼저 코드를 프로파일링하십시오.


우리의 창조물

저희 창작물을 꼭 확인해 보세요.

인베스터 센트럴 | 투자자 중앙 스페인어 | 중앙 독일 투자자 | 스마트리빙 | 시대와 메아리 | 수수께끼의 미스터리 | 힌두트바 | 엘리트 개발자 | JS 학교


우리는 중간에 있습니다

테크 코알라 인사이트 | Epochs & Echoes World | 투자자중앙매체 | 수수께끼 미스터리 매체 | 과학과 신기원 매체 | 현대 힌두트바

위 내용은 더 빠른 코드를 위한 강력한 Python 성능 최적화 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.