>백엔드 개발 >파이썬 튜토리얼 >Python 메모리 사용량 및 코드 실행 시간 모니터링

Python 메모리 사용량 및 코드 실행 시간 모니터링

WBOY
WBOY앞으로
2023-04-10 14:56:351567검색

내 코드의 어느 부분이 실행하는 데 가장 오래 걸리고 가장 많은 메모리를 사용합니까? 개선할 부분을 어떻게 찾을 수 있나요?

우리 대부분은 개발 중에 이 사실을 알고 싶어할 것입니다. 이 기사에서는 Python 코드의 시간과 메모리 사용량을 모니터링하는 몇 가지 방법을 요약했습니다.

Python 메모리 사용량 및 코드 실행 시간 모니터링

이 글에서는 4가지 방법을 소개하겠습니다. 처음 3가지 방법은 시간 정보를 제공하고, 네 번째 방법은 메모리 사용량을 얻을 수 있습니다.

  • time 모듈
  • %%time 매직 명령
  • line_profiler
  • memory_profiler

time 모듈

이는 코드 실행에 걸리는 시간을 계산하는 가장 간단하고 직접적인(그러나 수동 개발 필요) 방법입니다. . 그의 논리도 매우 간단합니다. 코드가 실행되기 전후의 시간을 기록하고 시간 간의 차이를 계산하는 것입니다. 이는 다음과 같이 달성할 수 있습니다.

import time
 
 start_time = time.time()
 result = 5+2
 end_time = time.time()
 
 print('Time taken = {} sec'.format(end_time - start_time))

다음 예는 for 루프와 목록 이해 간의 시간 차이를 보여줍니다.

import time
 
 # for loop vs. list comp
 list_comp_start_time = time.time()
 result = [i for i in range(0,1000000)]
 list_comp_end_time = time.time()
 print('Time taken for list comp = {} sec'.format(list_comp_end_time - list_comp_start_time))
 
 result=[]
 for_loop_start_time = time.time()
 for i in range(0,1000000):
 result.append(i)
 for_loop_end_time = time.time()
 print('Time taken for for-loop = {} sec'.format(for_loop_end_time - for_loop_start_time))
 
 list_comp_time = list_comp_end_time - list_comp_start_time
 for_loop_time = for_loop_end_time - for_loop_start_time
 print('Difference = {} %'.format((for_loop_time - list_comp_time)/list_comp_time * 100))

우리 모두 for가 느리다는 것을 알고 있습니다.

Time taken for list comp = 0.05843973159790039 sec
 Time taken for for-loop = 0.06774497032165527 sec
 Difference = 15.922795107582594 %

%%time Magic Command

Magic 명령은 특정 작업을 쉽게 수행할 수 있는 IPython 커널에 내장된 편리한 명령입니다. 일반적으로 jupyter 노트북에서 사용됩니다.

셀 시작 부분에 %%time을 추가하세요. 셀 실행이 완료된 후 셀 실행에 소요된 시간이 출력됩니다.

%%time
 def convert_cms(cm, unit='m'):
 '''
Function to convert cm to m or feet
'''
 if unit == 'm':
 return cm/100
 return cm/30.48
 
 convert_cms(1000)

결과는 다음과 같습니다.

CPU times: user 24 µs, sys: 1 µs, total: 25 µs
 Wall time: 28.1 µs
 
 Out[8]: 10.0

여기서 CPU 시간은 CPU가 코드를 처리하는 데 실제로 소비한 시간이고, Wall 시간은 이벤트가 경과한 실제 시간, 메서드 입력과 시작 사이의 시간입니다. 메소드 종료.

line_profiler

처음 두 메서드는 메서드를 실행하는 데 필요한 총 시간만 제공합니다. 시간 분석기를 통해 함수의 각 코드의 실행 시간을 얻을 수 있습니다.

여기서는 line_profiler 패키지를 사용해야 합니다. pip install line_profiler를 사용하십시오.

import line_profiler
 
 def convert_cms(cm, unit='m'):
 '''
Function to convert cm to m or feet
'''
 if unit == 'm':
 return cm/100
 return cm/30.48
 
 # Load the profiler
 %load_ext line_profiler
 
 # Use the profiler's magic to call the method
 %lprun -f convert_cms convert_cms(1000, 'f')

출력은 다음과 같습니다.

Timer unit: 1e-06 s
 
 Total time: 4e-06 s
 File: /var/folders/y_/ff7_m0c146ddrr_mctd4vpkh0000gn/T/ipykernel_22452/382784489.py
 Function: convert_cms at line 1
 
 Line # Hits Time Per Hit % Time Line Contents
 ==============================================================
1 def convert_cms(cm, unit='m'):
2 '''
3 Function to convert cm to m or feet
4 '''
5 1 2.0 2.0 50.0 if unit == 'm':
6 return cm/100
7 1 2.0 2.0 50.0 return cm/30.48

line_profiler가 각 코드 줄에 소요된 시간에 대한 자세한 정보를 제공하는 것을 볼 수 있습니다.

  • Line Contents: 실행 코드
  • Hits: 해당 라인이 실행된 횟수
  • Time: 소요된 총 시간(즉, 적중 횟수 x 적중 당 적중 횟수)
  • Per Hit: 실행된 시간 한 번의 실행에 소요되는 시간, 즉 Say Time = Hits
  • memory_profiler
line_profiler와 유사하게 memory_profiler는 코드의 라인별 메모리 사용량을 제공합니다.

설치하려면 pip install memory_profiler를 사용해야 합니다. 여기서는 Convert_cms_f 함수의 메모리 사용량을 모니터링합니다.

from conversions import convert_cms_f
 import memory_profiler
 
 %load_ext memory_profiler
 
 %mprun -f convert_cms_f convert_cms_f(1000, 'f')

convert_cms_f 함수는 별도의 파일에 정의한 후 가져옵니다. 결과는 다음과 같습니다.

Line # Mem usage Increment Occurrences Line Contents
 =============================================================
1 63.7 MiB 63.7 MiB 1 def convert_cms_f(cm, unit='m'):
2 '''
3 Function to convert cm to m or feet
4 '''
5 63.7 MiB 0.0 MiB 1 if unit == 'm':
6 return cm/100
7 63.7 MiB 0.0 MiB 1 return cm/30.48

memory_profiler는 각 코드 줄의 메모리 사용량에 대한 자세한 통찰력을 제공합니다.

1MiB(MebiByte)는 여기서 거의 1MB와 같습니다. 1MiB = 1.048576 1MB

그러나 memory_profiler에는 몇 가지 단점도 있습니다. 운영 체제 메모리를 쿼리하므로 결과가 Python 인터프리터와 약간 다를 수 있습니다. 세션에서 %mprun을 여러 번 실행하면 델타가 발생할 수 있습니다. 열은 모든 코드 라인 0.0MiB를 보고합니다. 이는 마법 명령의 한계 때문이다.

memory_profiler에는 몇 가지 문제가 있지만 메모리 사용량을 명확하게 이해할 수 있어 개발에 매우 ​​유용한 도구입니다.

요약

Python은 실행 효율성이 뛰어난 언어로 알려져 있지 않지만 이러한 명령은 일부 특별한 경우에 여전히 매우 유용합니다.

위 내용은 Python 메모리 사용량 및 코드 실행 시간 모니터링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제