Rumah >pembangunan bahagian belakang >Tutorial Python >Pantau penggunaan memori Python dan masa pelaksanaan kod
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.
Artikel ini akan memperkenalkan 4 kaedah 3 kaedah pertama memberikan maklumat masa, dan kaedah keempat boleh mendapatkan penggunaan memori.
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 %
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.
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.
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.48Tetapi 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. RingkasanWalaupun 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!