제퍼넷 로고

Python의 메모리 프로파일링 소개 – KDnuggets

시간

Python의 메모리 프로파일링 소개
작성자 별 이미지
 

Python 코드를 프로파일링하는 것은 코드 작동 방식을 이해하고 최적화 기회를 식별하는 데 도움이 됩니다. 아마도 Python 스크립트를 프로파일링한 적이 있을 것입니다. 시간 관련 측정항목—특정 코드 섹션의 실행 시간을 측정합니다. 

그러나 실행 중 메모리 할당 및 할당 해제를 이해하기 위한 메모리 프로파일링도 ​​마찬가지로 중요합니다. 메모리 프로파일링은 메모리 누수, 리소스 활용도, 확장과 관련된 잠재적 문제를 식별하는 데 도움이 될 수 있기 때문입니다. 

이 튜토리얼에서는 Python 패키지를 사용하여 메모리 사용량에 대한 Python 코드 프로파일링을 살펴보겠습니다. 메모리 프로파일 러.

pip를 사용하여 메모리 프로파일러 Python 패키지를 설치하는 것부터 시작해 보겠습니다.

pip3 install memory-profiler

 

주의 사항: 전용 메모리 프로파일러에 메모리 프로파일러를 설치합니다. 가상 환경 글로벌 환경 대신 프로젝트를 위해. 또한 메모리 사용량을 표시하기 위해 메모리 프로파일러에서 사용할 수 있는 표시 기능을 사용할 것입니다. 매트플롯립. 따라서 프로젝트의 가상 환경에 matplotlib도 설치되어 있는지 확인하십시오.

함수가 포함된 Python 스크립트(예: main.py)를 만들어 보겠습니다. process_strs:

  • 이 함수는 두 개의 매우 긴 Python 문자열을 생성합니다. str1str2 그리고 그것들을 연결합니다. 
  • 키워드 인수 reps 하드코딩된 문자열을 생성하기 위해 반복되는 횟수를 제어합니다. str1str2. 그리고 호출된 함수가 값을 지정하지 않는 경우 사용될 기본값인 10**6을 제공합니다. reps.
  • 그런 다음 명시적으로 삭제합니다. str2
  • 이 함수는 연결된 문자열을 반환합니다. str3.
# main.py

from memory_profiler import profile

@profile
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

스크립트를 실행하면 비슷한 출력이 제공됩니다. 

 

Python의 메모리 프로파일링 소개
 

출력에서 볼 수 있듯이 사용된 메모리, 각 후속 문자열 생성에 따른 증가, 사용된 메모리 중 일부를 확보하는 문자열 삭제 단계를 볼 수 있습니다.

mprof 명령 실행 

위에 표시된 Python 스크립트를 실행하는 대신 다음을 실행할 수도 있습니다. mprof 다음과 같은 명령 :

mprof run --python main.py

 

이 명령을 실행하면 메모리 사용량 데이터가 포함된 .dat 파일도 볼 수 있습니다. 실행할 때마다 하나의 .dat 파일이 생성됩니다. mprof 명령 - 타임스탬프로 식별됩니다.

 

Python의 메모리 프로파일링 소개

메모리 사용량 플로팅 

때로는 숫자를 보는 대신 플롯에서 메모리 사용량을 분석하는 것이 더 쉽습니다. 플롯 기능을 사용하는 데 필요한 종속성인 matplotlib에 대해 논의한 것을 기억하십시오. 

당신은을 사용할 수 있습니다 mprof plot .dat 파일의 데이터를 플롯하고 이를 이미지 파일(여기서는 output.png)에 저장하는 명령:

mprof plot -o output.png

 

기본적으로, mprof plot 가장 최근에 실행한 데이터를 사용했습니다. mprof 명령.

 

Python의 메모리 프로파일링 소개
 

플롯에 언급된 타임스탬프도 볼 수 있습니다.

로그 파일에 메모리 사용량 프로필 로깅

또는 작업 디렉터리의 기본 로그 파일에 메모리 사용량 통계를 기록할 수 있습니다. 여기서는 파일 핸들러를 생성합니다. mem_logs 로그 파일에 추가하고 stream 의 인수 @profile 파일 핸들러에 대한 데코레이터:

# main.py

from memory_profiler import profile

mem_logs = open('mem_profile.log','a')

@profile(stream=mem_logs)
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

이제 스크립트를 실행하면 작업 디렉터리에서 다음 내용이 포함된 mem_profile.log 파일을 볼 수 있습니다.

 

Python의 메모리 프로파일링 소개

당신은 또한 사용할 수 있습니다 memory_usage() 특정 기능을 실행하는 데 필요한 리소스를 이해하기 위해 정기적인 시간 간격으로 샘플링됩니다.

XNUMXD덴탈의 memory_usage function은 함수를 사용하여 프로필, 위치 및 키워드 인수를 튜플로 만듭니다.

여기서는 메모리 사용량을 알아보고 싶습니다. process_strs 키워드 인수가 있는 함수 reps 10**7로 설정합니다. 또한 샘플링 간격을 0.1초로 설정했습니다.

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.1)
print(mem_used)

 

해당 출력은 다음과 같습니다.

Output >>>
[21.21875, 21.71875, 147.34375, 277.84375, 173.93359375]

 

메모리 사용량을 캡처하려는 빈도에 따라 샘플링 간격을 조정할 수도 있습니다. 예를 들어 간격을 0.01초로 설정했습니다. 이는 이제 사용된 메모리에 대해 보다 세부적인 보기를 얻을 수 있음을 의미합니다.

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.01)
print(mem_used)

 

비슷한 출력을 볼 수 있습니다.

Output >>>
[21.40234375, 21.90234375, 33.90234375, 46.40234375, 59.77734375, 72.90234375, 85.65234375, 98.40234375, 112.65234375, 127.02734375, 141.27734375, 155.65234375, 169.77734375, 184.02734375, 198.27734375, 212.52734375, 226.65234375, 240.40234375, 253.77734375, 266.52734375, 279.90234375, 293.65234375, 307.40234375, 321.27734375, 227.71875, 174.1171875]

이 튜토리얼에서는 메모리 사용량에 대한 Python 스크립트 프로파일링을 시작하는 방법을 배웠습니다.

특히, 우리는 memory-profiler 패키지를 사용하여 이를 수행하는 방법을 배웠습니다. 우리는 @profile 장식가와 memory_usage() 샘플 Python 스크립트의 메모리 사용량을 가져오는 함수입니다. 또한 메모리 사용량을 표시하고 로그 파일에 통계를 캡처하는 등의 기능을 사용하는 방법도 배웠습니다.

실행 시간에 대한 Python 스크립트 프로파일링에 관심이 있다면 다음 내용을 읽어보세요. timeit 및 cProfile을 사용하여 Python 코드 프로파일링.
 
 

발라 프리야 C 인도 출신의 개발자이자 테크니컬 라이터입니다. 그녀는 수학, 프로그래밍, 데이터 과학 및 콘텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 분야는 DevOps, 데이터 과학 및 자연어 처리입니다. 그녀는 읽기, 쓰기, 코딩, 커피를 즐깁니다! 현재 그녀는 자습서, 사용 방법 가이드, 의견 등을 작성하여 개발자 커뮤니티와 지식을 배우고 공유하는 작업을 하고 있습니다.

spot_img

최신 인텔리전스

spot_img