Mengoptimalkan Performa Kode Python: Penyelaman Mendalam ke Profiler Python

Mengoptimalkan Performa Kode Python: Penyelaman Mendalam ke Profiler Python

Node Sumber: 1945969

Mengoptimalkan Performa Kode Python: Penyelaman Mendalam ke Profiler Python
Gambar oleh Penulis

Meskipun Python adalah salah satu bahasa pemrograman yang paling banyak digunakan, ketika datang ke kumpulan data besar sering kali mengalami waktu eksekusi yang buruk. Pembuatan profil adalah salah satu metode untuk memantau kinerja kode Anda secara dinamis dan mengidentifikasi jebakan. Perangkap ini mungkin menunjukkan adanya bug atau kode yang ditulis dengan buruk yang menghabiskan banyak sumber daya sistem. Menggunakan Profilers akan memberikan statistik terperinci dari program Anda yang dapat Anda gunakan untuk mengoptimalkan kode Anda untuk kinerja yang lebih baik. Mari kita lihat beberapa Python Profiler beserta contohnya.

cProfile adalah profiler bawaan di Python yang melacak setiap pemanggilan fungsi dalam program Anda. Ini memberikan informasi terperinci tentang seberapa sering suatu fungsi dipanggil, dan waktu eksekusi rata-ratanya. Karena dilengkapi dengan pustaka Python standar, kami tidak perlu menginstalnya secara eksplisit. Namun, ini tidak cocok untuk membuat profil data langsung karena menjebak setiap panggilan fungsi dan menghasilkan banyak statistik secara default.

Contoh

import cProfile def sum_(): total_sum = 0 # sum of numbers till 10000 for i in range(0,10001): total_sum += i return total_sum cProfile.run('sum_()')

 

Keluaran
 

4 function calls in 0.002 seconds
Ordered by: standard name
panggilan saat ini percall waktu mani percall nama file percall:lineno(fungsi)
1 0.000 0.000 0.002 0.002 :1( )
1 0.002 0.002 0.002 0.002 cprofile.py:3(jumlah_)
1 0.000 0.000 0.002 0.002 {metode bawaan bawaan.exec}
1 0.000 0.000 0.000 0.000 {metode 'menonaktifkan' objek '_lsprof.Profiler'}

Seperti yang Anda lihat dari output, modul cProfile menyediakan banyak informasi tentang performa fungsi. 

  • ncalls = Berapa kali fungsi dipanggil 
  • tottime = Total waktu yang dihabiskan dalam fungsi 
  • percall = Total waktu yang dihabiskan per panggilan
  • cumtime = Waktu kumulatif yang dihabiskan dalam sub-fungsi ini dan semua
  • percall = Waktu kumulatif yang dihabiskan per panggilan.

Line Profiler adalah modul python yang kuat yang melakukan pembuatan profil baris demi baris dari kode Anda. Terkadang, hotspot dalam kode Anda mungkin berupa satu baris dan tidak mudah untuk menemukannya langsung dari kode sumber. Line Profiler sangat berharga dalam mengidentifikasi berapa banyak waktu yang dibutuhkan oleh setiap baris untuk dieksekusi dan bagian mana yang paling membutuhkan perhatian untuk pengoptimalan. Namun, itu tidak datang dengan pustaka python standar dan perlu diinstal menggunakan perintah berikut:

pip install line_profiler

Contoh

from line_profiler import LineProfiler
def sum_arrays(): # creating large arrays arr1 = [3] * (5 ** 10) arr2 = [4] * (3 ** 11) return arr1 + arr2 lp = LineProfiler()
lp.add_function(sum_arrays)
lp.run('sum_arrays()')
lp.print_stats()

Keluaran
 

Timer unit: 1e-07 s
Total time: 0.0562143 s
File: e:KDnuggetsPython_Profilerslineprofiler.py
Function: sum_arrays at line 2
Garis # Hits Waktu Per Pukulan % Waktu Isi Baris
2 def jumlah_array():
3 # membuat array besar  
4 1 168563.0  168563.0  30.0 arr1 = [1] * (10 ** 6) 
5 1 3583.0 3583.0 0.6 arr2 = [2] * (2 * 10 ** 7)
6 1 389997.0  389997.0  69.4 kembalikan arr1 + arr2
  • Baris # = Nomor baris dalam file kode Anda
  • Hits = Tidak ada kali dieksekusi
  • Time = Total waktu yang dihabiskan untuk mengeksekusi baris
  • Per Hit = Rata-rata waktu yang dihabiskan per hit
  • % Waktu = Persentase waktu yang dihabiskan pada baris relatif terhadap total waktu fungsi
  • Isi Baris = Kode Sumber Aktual

Profiler memori adalah profiler python yang melacak alokasi memori kode Anda. Itu juga dapat menghasilkan grafik nyala untuk membantu menganalisis penggunaan memori dan mengidentifikasi kebocoran memori dalam kode Anda. Ini juga berguna untuk mengidentifikasi daerah hotspot yang menyebabkan banyak alokasi karena aplikasi python seringkali rentan terhadap masalah manajemen memori. Profiler memori membuat profil statistik baris demi baris tentang konsumsi memori dan perlu diinstal menggunakan perintah berikut:

pip install memory_profiler

Contoh

import memory_profiler
import random def avg_marks(): # Genrating Random marks for 50 students for each section sec_a = random.sample(range(0, 100), 50) sec_b = random.sample(range(0, 100), 50) # combined average marks of two sections avg_a = sum(sec_a) / len(sec_a) avg_b = sum(sec_b) / len(sec_b) combined_avg = (avg_a + avg_b)/2 return combined_avg memory_profiler.profile(avg_marks)()

Keluaran
 

Filename: e:KDnuggetsPython_Profilersmemoryprofiler.py
Garis # penggunaan Mem Kenaikan Kejadian Isi Baris
4 21.7 MiB  21.7 MiB  1 def rata-rata_marks():
5 # Menghasilkan nilai Acak untuk 50 siswa untuk setiap bagian
6 21.8 MiB 0.0 MiB  1 sec_a = acak.sample(rentang(0, 100), 50)
7 21.8 MiB 0.0 MiB  1 sec_b = acak.sample(rentang(0, 100), 50)
8
9 # nilai rata-rata gabungan dari dua bagian
10 21.8 MiB 0.0 MiB  1 avg_a = jumlah(detik_a) / len(detik_a)
11 21.8 MiB 0.0 MiB  1 avg_b = jumlah(detik_b) / len(detik_b)
12 21.8 MiB 0.0 MiB  1 gabungan_avg = (avg_a + avg_b)/2
13 21.8 MiB 0.0 MiB  1 mengembalikan gabungan_rata-rata
  • Baris # = Nomor baris dalam file kode Anda
  • Penggunaan Mem = Penggunaan memori dari Python Interpreter
  • Kenaikan = Selisih memori yang dikonsumsi dari baris saat ini dengan yang sebelumnya
  • Occurences = Tidak ada kali baris kode dieksekusi
  • Isi Baris = Kode Sumber Aktual

Timeit adalah pustaka Python bawaan yang dirancang khusus untuk mengevaluasi kinerja cuplikan kode kecil. Ini adalah alat yang ampuh yang dapat membantu Anda mengidentifikasi dan mengoptimalkan hambatan kinerja dalam kode Anda, memungkinkan Anda untuk menulis kode lebih cepat dan lebih efisien. Implementasi yang berbeda dari suatu algoritma juga dapat dibandingkan dengan menggunakan modul timeit tetapi sisi negatifnya adalah bahwa hanya baris kode individu yang dapat dianalisis menggunakannya.

Contoh

import timeit
code_to_test = """
# creating large arrays
arr1 = [3] * (5 ** 10)
arr2 = [4] * (3 ** 11)
arr1 + arr2 """
elapsed_time = timeit.timeit(code_to_test, number=10)
print(f'Elapsed time: {elapsed_time}')

Keluaran
 

Elapsed time: 1.3809973997995257

Penggunaannya terbatas hanya untuk mengevaluasi cuplikan kode yang lebih kecil. Satu hal penting yang perlu diperhatikan adalah ini menampilkan waktu yang berbeda setiap kali cuplikan kode dijalankan. Ini karena Anda mungkin memiliki proses lain yang berjalan di komputer Anda dan alokasi sumber daya dapat bervariasi dari satu proses ke proses lainnya, sehingga sulit untuk mengontrol semua variabel dan mencapai waktu pemrosesan yang sama untuk setiap proses.

Yappi adalah profiler python yang memungkinkan Anda mengidentifikasi hambatan kinerja dengan mudah. Itu ditulis dalam C, menjadikannya salah satu profiler paling efisien yang tersedia. Ini memiliki API yang dapat disesuaikan yang memungkinkan Anda hanya membuat profil bagian tertentu dari kode Anda yang perlu Anda fokuskan, memberi Anda lebih banyak kontrol atas proses pembuatan profil. Kemampuannya untuk memprofilkan coroutine secara bersamaan memberikan pemahaman mendalam tentang cara kerja kode Anda.  

Contoh

import yappi
def sum_arrays(): # creating large arrays arr1 = [3] * (5 ** 10) arr2 = [4] * (3 ** 11) return arr1 + arr2 with yappi.run(builtins=True): final_arr = sum_arrays() print("n--------- Function Stats -----------")
yappi.get_func_stats().print_all() print("n--------- Thread Stats -----------")
yappi.get_thread_stats().print_all() print("nYappi Backend Types: ",yappi.BACKEND_TYPES)
print("Yappi Clock Types: ", yappi.CLOCK_TYPES)

Catatan: Instal yappi menggunakan perintah ini: pip install yappi

 
Keluaran
 

--------- Function Stats ----------- Clock type: CPU
Ordered by: totaltime, desc
nama panggilan tsub itu tag
..lersyappiProfiler.py:4 sum_arrays 1 0.109375 0.109375 0.109375
bawaan. Berikutnya 1 0.000000 0.000000 0.000000
.. _GeneratorContextManager.__exit__ 1 0.000000 0.000000 0.000000

——— Utas Statistik ———–

 

nama id waktu itu aroma
_Utas Utama 0 15148 0.187500  1
Yappi Backend Types: {'NATIVE_THREAD': 0, 'GREENLET': 1}
Yappi Clock Types: {'WALL': 0, 'CPU': 1}

Ingatlah untuk memberi nama modul Anda secara berbeda untuk modul bawaan. Jika tidak, impor akan mengimpor modul Anda (yaitu file python Anda) alih-alih modul bawaan yang sebenarnya.

Dengan menggunakan profiler ini, developer dapat mengidentifikasi kemacetan dalam kode mereka dan memutuskan penerapan mana yang terbaik. Dengan alat yang tepat dan sedikit pengetahuan, siapa pun dapat membawa kode Python mereka ke tingkat kinerja berikutnya. Jadi, bersiaplah untuk mengoptimalkan pengoptimalan kinerja Python Anda dan saksikan itu melambung ke ketinggian baru!

Saya senang Anda memutuskan untuk membaca artikel ini dan saya harap ini menjadi pengalaman berharga bagi Anda.
 
 
Kanwal Mehreen adalah pengembang perangkat lunak yang bercita-cita tinggi dengan minat dalam ilmu data dan aplikasi AI dalam kedokteran. Kanwal terpilih sebagai Google Generation Scholar 2022 untuk wilayah APAC. Kanwal suka berbagi pengetahuan teknis dengan menulis artikel tentang topik yang sedang tren, dan bersemangat untuk meningkatkan representasi perempuan di industri teknologi.
 

Stempel Waktu:

Lebih dari KDnugget