내 코드의 어느 부분이 실행하는 데 가장 오래 걸리고 가장 많은 메모리를 사용합니까? 개선할 부분을 어떻게 찾을 수 있나요?
우리 대부분은 개발 중에 이 사실을 알고 싶어할 것입니다. 이 기사에서는 Python 코드의 시간과 메모리 사용량을 모니터링하는 몇 가지 방법을 요약했습니다.
이 글에서는 4가지 방법을 소개하겠습니다. 처음 3가지 방법은 시간 정보를 제공하고, 네 번째 방법은 메모리 사용량을 얻을 수 있습니다.
이는 코드 실행에 걸리는 시간을 계산하는 가장 간단하고 직접적인(그러나 수동 개발 필요) 방법입니다. . 그의 논리도 매우 간단합니다. 코드가 실행되기 전후의 시간을 기록하고 시간 간의 차이를 계산하는 것입니다. 이는 다음과 같이 달성할 수 있습니다.
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 %
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 패키지를 사용해야 합니다. 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가 각 코드 줄에 소요된 시간에 대한 자세한 정보를 제공하는 것을 볼 수 있습니다.
from conversions import convert_cms_f import memory_profiler %load_ext memory_profiler %mprun -f convert_cms_f convert_cms_f(1000, '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.48memory_profiler는 각 코드 줄의 메모리 사용량에 대한 자세한 통찰력을 제공합니다. 1MiB(MebiByte)는 여기서 거의 1MB와 같습니다. 1MiB = 1.048576 1MB그러나 memory_profiler에는 몇 가지 단점도 있습니다. 운영 체제 메모리를 쿼리하므로 결과가 Python 인터프리터와 약간 다를 수 있습니다. 세션에서 %mprun을 여러 번 실행하면 델타가 발생할 수 있습니다. 열은 모든 코드 라인 0.0MiB를 보고합니다. 이는 마법 명령의 한계 때문이다. memory_profiler에는 몇 가지 문제가 있지만 메모리 사용량을 명확하게 이해할 수 있어 개발에 매우 유용한 도구입니다. 요약Python은 실행 효율성이 뛰어난 언어로 알려져 있지 않지만 이러한 명령은 일부 특별한 경우에 여전히 매우 유용합니다.
위 내용은 Python 메모리 사용량 및 코드 실행 시간 모니터링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!