Cara menggunakan timeit untuk membuat profil kode Python

Secara desain, Python mengedepankan kenyamanan, keterbacaan, dan kemudahan penggunaan di atas performa. Tetapi itu tidak berarti Anda harus puas dengan kode Python yang lambat. Mungkin ada sesuatu yang dapat Anda lakukan untuk mempercepatnya.

Di antara alat yang tersedia untuk membuat profil kinerja kode Python, yang paling sederhana adalah timeitmodul. timeitdigunakan untuk mengukur kecepatan cuplikan kecil kode - beberapa baris, fungsi - dengan menjalankan kode ribuan atau bahkan jutaan kali dan melaporkan berapa lama eksekusi tersebut selesai.

timeitpaling berguna untuk membandingkan dua atau tiga cara berbeda untuk melakukan sesuatu dan melihat mana yang tercepat. Misalnya, loop yang berjalan untuk ribuan iterasi adalah bottleneck Python yang umum. Jika Anda dapat menemukan cara untuk mempercepat implementasi loop itu - katakanlah, dengan menggunakan Python built-in alih-alih kode tulisan tangan - Anda bisa mendapatkan peningkatan kinerja yang terukur.

Contoh sederhana Python timeit

Berikut adalah contoh sederhana cara timeitkerjanya:

def f1 (): untuk n dalam range (100): lulus def f2 (): n = 0 sedangkan n <100: n + = 1 if __name__ == "__main__": import timeit print (timeit.timeit (f1, number = 100000)) cetak (timeit.timeit (f2, number = 100000)) 

Program ini membandingkan performa dari dua cara untuk melakukan iterasi melalui loop 100 kali: dengan menggunakan built-in range function ( f1) Python  , dan dengan menambahkan variabel ( f2). timeit menjalankan setiap pendekatan ini 100.000 kali, dan menyediakan waktu proses total di akhir untuk masing-masing pendekatan. Secara default,  timeit menggunakan satu juta proses, tetapi contoh ini menunjukkan bagaimana Anda dapat mengatur jumlah proses ke angka apa pun yang tampaknya sesuai.

Hasil (dari prosesor Intel i7-3770K):

0,1252315

0.45453989999999994

Jelas  range pendekatannya jauh lebih cepat, dengan faktor sekitar 3,75. Ini tidak mengherankan; menggunakan Python bawaan biasanya menghasilkan kinerja yang lebih baik daripada memanipulasi objek Python secara manual.

Gunakan Python timeit dengan melewatkan string

Cara lain untuk menggunakan  timeit adalah dengan mengirimkan string yang dievaluasi sebagai program Python:

impor waktu itu

print (timeit.timeit ('untuk n dalam jangkauan (100): lulus'))

Ini juga dapat dilakukan dari baris perintah:

python -m timeit "untuk n dalam kisaran (100): lulus"

Namun secara keseluruhan, lebih mudah menggunakan teknik yang ditunjukkan di atas, karena Anda tidak perlu dengan canggung memasukkan kode Anda ke dalam string teks.

Kiat waktu untuk Python

timeit Meskipun berguna  , ingatlah peringatan ini tentang cara menggunakannya.

Hindari menggunakan timeit untuk pembuatan profil seluruh program

Tidak ada yang mengatakan Anda  tidak dapat mengatur  waktu seluruh program  timeit. Skrip 10 baris sederhana, misalnya, bukanlah kandidat yang buruk untuk diprofilkan dengan cara ini.

Tetapi ada alat yang lebih baik untuk pekerjaan itu - misalnya, cProfile modul Python  , yang menghasilkan statistik yang jauh lebih rinci tentang keseluruhan kinerja program Anda. timeit berfungsi paling baik dengan satu komponen atau cuplikan kode - sekali lagi, fungsi atau beberapa baris kode. Lebih dari itu biasanya akan menghasilkan hasil yang terlalu berisik dan tidak konsisten untuk memberi Anda informasi kinerja yang berarti.

Selain itu, jika program yang Anda buat profilnya membutuhkan waktu beberapa menit untuk diselesaikan,  timeit tidak akan banyak berguna. Pertama, akan memakan waktu terlalu lama untuk menjalankan kode lebih dari beberapa kali, jadi pengaturan waktu yang dikumpulkan akan sangat kasar. Untuk dua, alat lain lebih cocok untuk pekerjaan itu.

Lakukan beberapa kali ini berjalan pada mesin yang berbeda

Program tidak berjalan dengan kecepatan yang sama setiap saat. Lingkungan komputasi modern memperkenalkan banyak ketidakpastian - persaingan dengan program lain untuk sumber daya, perilaku cache, penjadwalan, dan sebagainya. timeit mencoba untuk mengimbangi ini dengan menjalankan kode ad infinitum, tetapi masih merupakan ide yang baik untuk menggabungkan beberapa uji coba. Anda harus menjalankan  timeit profil berkali-kali, membuang skor terburuk dan terbaik, dan rata-rata sisanya.

Terakhir, ini juga membantu untuk menjalankan pengujian yang sama pada sistem yang berbeda: bagaimana sesuatu yang terikat pada disk akan berperilaku pada SSD versus hard drive berputar konvensional? Seperti pertanyaan lain tentang kinerja - jangan menebak, uji.