Python 코드를 최적화하기 위한 몇 가지 필수 팁과 요령 2부
7) 멤버십 테스트를 위해 집합 및 사전 사용
세트와 딕셔너리는 파이썬에서 해시 테이블로 구현되어 목록보다 멤버십 테스트에 훨씬 빠릅니다. 요소가 컬렉션에 있는지 여부를 테스트해야 하는 경우 목록 대신 집합 또는 사전을 사용하세요.
예시 )
# 멤버십 테스트를 위해 목록 사용
names = ['Alice', 'Bob', 'Charlie']
if 'Alice' in names:
print('Alice is present')
# 멤버십 테스트를 위해 세트 사용
names = {'Alice', 'Bob', 'Charlie'}
if 'Alice' in names:
print('Alice is present')
# 멤버십 테스트를 위해 사전 사용
names = {'Alice': 1, 'Bob': 2, 'Charlie': 3}
if 'Alice' in names:
print('Alice is present')
위의 예에서 집합 또는 사전을 사용하는 것이 구성원 테스트를 위해 목록을 사용하는 것보다 훨씬 빠릅니다.
8) map()목록의 각 요소에 함수를 적용하는 함수 사용
목록의 각 요소에 함수를 적용할 때 변환된 요소로 새 목록을 만들어야 하는 경우가 많습니다. for 루프를 사용하는 대신 map()함수를 사용하십시오. 이 map()함수는 iterable의 각 요소에 함수를 적용하고 변환된 요소를 생성하는 반복자를 반환합니다.
예시 )
# 목록의 각 요소에 함수를 적용하기 위해 for 루프 사용
numbers = [1, 2, 3, 4, 5]
squares = []
for number in numbers:
squares.append(number**2)
# map() 함수를 사용하여 목록의 각 요소에 함수를 적용합니다.
numbers = [1, 2, 3, 4, 5]
squares = map(lambda x: x**2, numbers)
위의 예에서 map()for 루프를 사용하는 것보다 함수를 사용하는 것이 더 효율적입니다.
9) 숫자 연산에 NumPy 사용
NumPy는 빠르고 효율적으로 설계된 수치 컴퓨팅용 Python 라이브러리입니다. Python에서 숫자 데이터로 작업하는 경우 표준 Python 목록 대신 NumPy를 사용하는 것이 좋습니다. NumPy는 표준 Python 목록에 비해 다음과 같은 몇 가지 이점을 제공합니다.
벡터화된 작업: NumPy를 사용하면 전체 배열에서 한 번에 작업을 수행할 수 있으므로 for 루프를 사용하는 것보다 훨씬 빠릅니다.
효율적인 메모리 사용: NumPy는 표준 Python 목록보다 적은 메모리를 사용하므로 더 큰 데이터 세트로 작업할 수 있습니다.
브로드캐스팅: NumPy는 모양이 다른 배열 간에 작업을 자동으로 브로드캐스트하여 벡터화된 코드를 더 쉽게 작성할 수 있습니다.
다음 예를 고려하십시오.
# 수치 연산을 위해 표준 Python 목록 사용
a = [1, 2, 3]
b = [4, 5, 6]
c = []
for i in range(len(a)):
c.append(a[i] + b[i])
# 숫자 연산에 NumPy 사용
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = a + b
위의 예에서 NumPy를 사용하는 것이 수치 연산에 표준 Python 목록을 사용하는 것보다 훨씬 빠르고 효율적입니다.
10) 고성능 컴퓨팅을 위해 Cython 또는 Numba 사용
Cython과 Numba는 Python으로 고성능 코드를 작성할 수 있게 해주는 Python 라이브러리입니다. Cython은 Python의 상위 집합인 프로그래밍 언어입니다. 즉, Python과 거의 동일하지만 훨씬 빠르게 실행되는 코드를 Cython에서 작성할 수 있습니다. Numba는 런타임 시 기계 코드로 컴파일되는 Python 코드를 작성할 수 있게 해주는 Python용 Just-In-Time 컴파일러입니다.
결과적으로 실행 속도가 훨씬 빨라집니다. 다음은 Cython 및 Numba 사용에 대한 몇 가지 팁입니다.
낮은 수준의 최적화가 필요한 계산 집약적인 코드에 Cython을 사용하세요.
배열 연산으로 표현될 수 있는 숫자 코드에는 Numba를 사용하세요.
유형 주석을 사용하여 Cython과 Numba 모두에서 성능을 향상시키세요~
예시 )
# 표준 Python for 루프 사용
def sum_squares(n):
result = 0
for i in range(n):
result += i**2
return result
# 루프에 Cython 사용
%load_ext Cython
%%cython
def sum_squares_cython(int n):
cdef int result = 0
for i in range(n):
result += i**2
return result
# Numba for 루프 사용
from numba import jit
@jit
def sum_squares_numba(n):
result = 0
for i in range(n):
result += i**2
return result
위의 예에서 함수의 Cython 및 Numba 버전은 표준 Python 버전보다 훨씬 빠릅니다.
11) 병렬 처리를 위한 다중 처리 사용
대규모 데이터 세트 또는 계산 집약적인 작업으로 작업하는 경우 다중 처리를 사용하여 코드를 병렬화하면 도움이 될 수 있습니다. Multiprocessing은 여러 CPU 코어를 활용하여 여러 프로세스를 병렬로 실행할 수 있는 Python 라이브러리입니다. 다음은 다중 처리 사용에 대한 몇 가지 팁입니다.
- 클래스를 사용하여 Pool작업자 프로세스 풀을 만듭니다.
- 이 map()메서드를 사용하여 함수를 여러 입력에 병렬로 적용합니다.
- Process보다 세분화된 제어를 위해 클래스를 사용하여 개별 프로세스를 생성합니다.
예시 )
import multiprocessing
# 병렬로 적용할 함수
def square(number):
return number**2
# 작업자 프로세스 풀 사용
if __name__ == '__main__':
with multiprocessing.Pool(processes=4) as pool:
numbers = [1, 2, 3, 4, 5]
results = pool.map(square, numbers)
위의 예에서 함수는 여러 CPU 코어를 활용하여 목록의 각 요소에 병렬로 square()적용됩니다 .numbers
결론
Python은 과학 컴퓨팅, 데이터 분석 및 웹 개발에 널리 사용되는 다재다능하고 강력한 프로그래밍 언어입니다.
그러나 Python은 계산 집약적인 작업의 경우 속도가 느릴 수 있으므로 성능을 위해 코드를 최적화하는 것이 중요합니다.
이 블로그 게시물에서 목록 내포 사용, 불필요한 계산 방지, 내장 함수 및 모듈 사용, 멤버십 테스트를 위한 집합 및 사전 사용,map()목록의 각 요소에 함수를 적용하고, 수치 연산에 NumPy를 사용하고, 고성능 컴퓨팅에 Cython 및 Numba를 사용하고, 병렬 처리에 다중 처리를 사용하는 함수. 이러한 사례만 바꿔도 더 빠르고 효율적으로 실행되는 Python 코드를 작성할 수 있으므로 대규모 데이터 세트 및 계산 집약적인 작업을 보다 쉽게 수행할 수 있습니다.
'파이썬' 카테고리의 다른 글
[Python]#30 AI 및 기계 학습 개발에서 Python의 역할 (0) | 2023.03.28 |
---|---|
[Python]#29 Pandas란 무엇이며 Python에서 데이터 분석에 Pandas를 사용하는 방법 (0) | 2023.03.27 |
[Python]#27 Python 코드 최적화를 위한 몇 가지 방법_1 (0) | 2023.03.24 |
Python의 정규식 초보자 가이드 (0) | 2023.03.23 |
정렬 알고리즘[버블정렬, 삽입정렬, 선택정렬, 퀵정렬, 병합정렬] (0) | 2023.03.21 |