Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pantau penggunaan memori Python dan masa pelaksanaan kod

Pantau penggunaan memori Python dan masa pelaksanaan kod

WBOY
WBOYke hadapan
2023-04-10 14:56:351504semak imbas

Bahagian kod saya yang manakah mengambil masa paling lama untuk dijalankan dan menggunakan paling banyak memori? Bagaimanakah saya boleh mencari kawasan untuk penambahbaikan?

Semasa pembangunan, saya pasti kebanyakan daripada kita ingin mengetahui perkara ini, dalam artikel ini saya telah merumuskan beberapa cara untuk memantau masa dan penggunaan memori kod Python anda.

Pantau penggunaan memori Python dan masa pelaksanaan kod

Artikel ini akan memperkenalkan 4 kaedah 3 kaedah pertama memberikan maklumat masa, dan kaedah keempat boleh mendapatkan penggunaan memori.

  • modul masa
  • %%perintah sihir masa
  • line_profiler
  • memory_profiler

modul masa

Ini adalah cara yang paling mudah dan paling mudah (tetapi memerlukan pembangunan manual) untuk mengira tempoh masa yang diperlukan untuk kod anda dijalankan. Logiknya juga sangat mudah: rekod masa sebelum dan selepas kod dijalankan, dan hitung perbezaan antara masa. Ini boleh dicapai seperti berikut:

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

Contoh berikut menunjukkan perbezaan masa antara gelung untuk dan pemahaman senarai:

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))

Kita semua tahu bahawa untuk adalah lebih perlahan.

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

%%time Magic Command

Magic command ialah arahan yang mudah dibina dalam kernel IPython yang boleh melaksanakan tugas tertentu dengan mudah. Secara amnya, ia digunakan dalam buku nota jupyter.

Tambah %%masa pada permulaan sel Selepas pelaksanaan sel selesai, masa yang dihabiskan untuk pelaksanaan sel akan dikeluarkan.

%%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)

Hasilnya adalah seperti berikut:

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

Masa CPU di sini ialah masa sebenar yang dibelanjakan oleh CPU memproses kod dan masa Wall ialah masa sebenar peristiwa itu berlalu Masa antara kemasukan kaedah dan keluar kaedah.

line_profiler

Dua kaedah pertama hanya menyediakan jumlah masa yang diperlukan untuk melaksanakan kaedah tersebut. Melalui penganalisis masa kita boleh mendapatkan masa berjalan setiap kod dalam fungsi tersebut.

Di sini kita perlu menggunakan pakej line_profiler. Gunakan 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')

Outputnya adalah seperti berikut:

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

Anda boleh melihat bahawa line_profiler memberikan maklumat terperinci tentang masa yang dihabiskan pada setiap baris kod.

  • Kandungan Baris: kod sedang dijalankan
  • Tindakan: bilangan kali baris itu dilaksanakan
  • Masa: jumlah masa yang dibelanjakan (iaitu bilangan hits x bilangan hits setiap masa )
  • Per Hit: masa yang diperlukan untuk satu pelaksanaan, iaitu, Masa = Hit Ya, setiap baris kod menganalisis masa secara terperinci, yang sangat membantu untuk kami untuk menganalisis masa.
  • memory_profiler
Sama seperti line_profiler, memory_profiler menyediakan penggunaan memori baris demi baris bagi kod anda.

Untuk memasangnya anda perlu menggunakan pip install memory_profiler. Di sini kami memantau penggunaan memori bagi fungsi convert_cms_f.

Fungsi convert_cms_f ditakrifkan dalam fail berasingan dan kemudian diimport. Hasilnya adalah seperti berikut:

memory_profiler memberikan cerapan terperinci tentang penggunaan memori setiap baris kod.
from conversions import convert_cms_f
 import memory_profiler
 
 %load_ext memory_profiler
 
 %mprun -f convert_cms_f convert_cms_f(1000, 'f')

1 MiB (MebiByte) di sini hampir sama dengan 1MB. 1 MiB = 1.048576 1MB

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
Tetapi memory_profiler juga mempunyai beberapa kelemahan: ia menanyakan memori sistem pengendalian, jadi hasilnya mungkin berbeza sedikit daripada penterjemah python Jika anda menjalankan %mprun beberapa kali dalam satu sesi, anda boleh perhatikan peningkatan Lajur pengukuran melaporkan 0.0 MiB untuk semua baris kod. Ini disebabkan oleh keterbatasan arahan sihir.

Walaupun memory_profiler mempunyai beberapa masalah, ia membolehkan kami memahami dengan jelas penggunaan memori dan merupakan alat yang sangat berguna untuk pembangunan.

Ringkasan

Walaupun Python bukan bahasa yang terkenal dengan kecekapan pelaksanaannya, arahan ini masih sangat membantu kami dalam beberapa kes khas.

Atas ialah kandungan terperinci Pantau penggunaan memori Python dan masa pelaksanaan kod. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam