Menggunakan Python Timeit untuk Mengatur Waktu Kode Anda
Diterbitkan: 2023-01-17Dalam tutorial ini, Anda akan belajar cara menggunakan fungsi timeit dari modul timeit Python. Anda akan mempelajari cara mengatur waktu ekspresi dan fungsi sederhana di Python.
Pengaturan waktu kode Anda dapat membantu Anda mendapatkan perkiraan waktu eksekusi sepotong kode dan juga mengidentifikasi bagian kode yang perlu dioptimalkan.
Kita akan mulai dengan mempelajari sintaks fungsi timeit
Python. Dan kemudian kita akan membuat kode contoh untuk memahami cara menggunakannya untuk mengatur waktu blok kode dan fungsi dalam modul Python Anda. Mari kita mulai.
Cara Menggunakan Fungsi timeit Python
Modul timeit
adalah bagian dari pustaka standar Python, dan Anda dapat mengimpornya:
import timeit
Sintaks untuk menggunakan fungsi timeit
dari modul timeit
adalah seperti yang ditunjukkan di bawah ini:
timeit.timeit(stmt, setup, number)
Di Sini:
-
stmt
adalah bagian dari kode yang waktu eksekusinya akan diukur. Anda dapat menentukannya sebagai string Python sederhana atau string multiline, atau meneruskan nama yang dapat dipanggil. - Seperti namanya,
setup
menunjukkan potongan kode yang perlu dijalankan hanya sekali, seringkali sebagai prasyarat untuk menjalankanstmt
. Misalnya, Anda menghitung waktu eksekusi untuk pembuatan larik NumPy. Dalam hal ini, mengimpornumpy
adalah kodesetup
dan pembuatan sebenarnya adalah pernyataan yang akan dihitung waktunya. -
number
parameter menunjukkan berapa kalistmt
dijalankan. Nilai defaultnumber
adalah 1 juta (1.000.000), tetapi Anda juga dapat menyetel parameter ini ke nilai lain pilihan Anda.
Sekarang setelah kita mempelajari sintaks untuk menggunakan fungsi timeit()
, mari kita mulai membuat kode beberapa contoh.
Mengatur Waktu Ekspresi Python Sederhana
Pada bagian ini, kita akan mencoba mengukur waktu eksekusi ekspresi Python sederhana menggunakan timeit.
Mulai REPL Python dan jalankan contoh kode berikut. Di sini, kami menghitung waktu eksekusi eksponensial dan operasi pembagian lantai untuk 10.000 dan 100.000 operasi.
Perhatikan bahwa kita meneruskan pernyataan untuk diatur waktunya sebagai string Python dan menggunakan titik koma untuk memisahkan berbagai ekspresi dalam pernyataan.
>>> import timeit >>> timeit.timeit('3**4;3//4',number=10000) 0.0004020999999738706 >>> timeit.timeit('3**4;3//4',number=100000) 0.0013780000000451764
Menjalankan waktu Python di Command Line
Anda juga dapat menggunakan timeit
di baris perintah. Berikut adalah baris perintah yang setara dengan pemanggilan fungsi timeit:
$ python-m timeit -n [number] -s [setup] [stmt]
-
python -m timeit
menunjukkan bahwa kita menjalankantimeit
sebagai modul utama. -
n
adalah opsi baris perintah yang menunjukkan berapa kali kode harus dijalankan. Ini setara dengan argumennumber
dalam pemanggilan fungsitimeit()
. - Anda dapat menggunakan opsi
-s
untuk menentukan kode penyiapan.
Di sini, kami menulis ulang contoh sebelumnya menggunakan persamaan baris perintah:
$ python -m timeit -n 100000 '3**4;3//4' 100000 loops, best of 5: 35.8 nsec per loop
Dalam contoh ini, kami menghitung waktu eksekusi fungsi len()
bawaan. Inisialisasi string adalah kode penyiapan yang diteruskan menggunakan opsi s
.
$ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)' 100000 loops, best of 5: 239 nsec per loop
Pada output, perhatikan bahwa kita mendapatkan waktu eksekusi untuk 5 proses terbaik . Apa artinya ini? Saat Anda menjalankan timeit
pada baris perintah, opsi repeat
r
diatur ke nilai default 5. Ini berarti eksekusi stmt
untuk number
waktu yang ditentukan diulang lima kali, dan waktu eksekusi terbaik dikembalikan.
Analisis Metode Pembalikan String Menggunakan timeit
Saat bekerja dengan string Python, Anda mungkin ingin membalikkannya. Dua pendekatan paling umum untuk pembalikan string adalah sebagai berikut:
- Menggunakan pemotongan tali
- Menggunakan fungsi
reversed()
dan metodejoin()
Membalikkan String Python Menggunakan Pemotongan String
Mari kita bahas cara kerja pemotongan string, dan bagaimana Anda bisa menggunakannya untuk membalikkan string Python. Menggunakan sintaks some-string[start:stop]
mengembalikan potongan string yang dimulai dari start
indeks dan memanjang hingga indeks stop-1
. Mari kita ambil contoh.
Pertimbangkan string berikut 'Python'. String dengan panjang 6 dan daftar indeks adalah 0, 1, 2 hingga 5.
>>> string_1 = 'Python'
Saat Anda menentukan nilai start
dan stop
, Anda mendapatkan irisan string yang memanjang dari start
hingga stop-1
. Oleh karena itu, string_1[1:4]
mengembalikan 'yth'.
>>> string_1 = 'Python' >>> string_1[1:4] 'yth'
Saat Anda tidak menentukan nilai start
, nilai start
default nol digunakan, dan irisan dimulai pada indeks nol dan memanjang hingga stop - 1
.
Di sini, nilai stop
adalah 3, sehingga irisan dimulai dari indeks 0 dan naik ke indeks 2.
>>> string_1[:3] 'Pyt'
Saat Anda tidak menyertakan indeks stop
, Anda melihat bahwa irisan dimulai dari indeks start
(1) dan memanjang hingga akhir string.
>>> string_1[1:] 'ython'
Mengabaikan nilai start
dan stop
akan mengembalikan potongan dari seluruh string.
>>> string_1[::] 'Python'
Mari buat irisan dengan nilai step
. Tetapkan nilai start
, stop
, dan step
masing-masing ke 1, 5, dan 2. Kami mendapatkan sepotong string mulai dari 1 memanjang hingga 4 (tidak termasuk titik akhir 5) yang berisi setiap karakter kedua .
>>> string_1[1:5:2] 'yh'
Saat Anda menggunakan langkah negatif, Anda bisa mendapatkan irisan mulai dari akhir string. Dengan langkah diatur ke -2, string_1[5:2:-2]
memberikan irisan berikut:
>>> string_1[5:2:-2] 'nh'
Jadi untuk mendapatkan salinan terbalik dari string, kita stop
nilai start
dan akhir dan setel langkah ke -1, seperti yang ditunjukkan:
>>> string_1[::-1] 'nohtyP'
Singkatnya:
string[::-1]
mengembalikan salinan terbalik dari string.
Membalikkan String Menggunakan Fungsi Built-In dan Metode String
Fungsi built-in reversed()
di Python akan mengembalikan iterator terbalik atas elemen string.
>>> string_1 = 'Python' >>> reversed(string_1) <reversed object at 0x00BEAF70>
Jadi Anda dapat mengulang melalui iterator terbalik menggunakan for loop:
for char in reversed(string_1): print(char)
Dan akses elemen string dalam urutan terbalik.
# Output n o h t y P
Selanjutnya, Anda dapat memanggil metode join()
pada iterator terbalik dengan sintaks: <sep>.join(reversed(some-string))
.
Cuplikan kode di bawah menunjukkan beberapa contoh di mana pemisah masing-masing adalah tanda hubung dan spasi putih.
>>> '-'.join(reversed(string1)) 'nohtyP' >>> ' '.join(reversed(string1)) 'nohty P'
Di sini, kami tidak ingin ada pemisah; jadi setel pemisah ke string kosong untuk mendapatkan salinan string yang dibalik:
>>> ''.join(reversed(string1)) 'nohtyP'
Menggunakan
''.join(reversed(some-string))
mengembalikan salinan terbalik dari string.
Membandingkan Waktu Eksekusi Menggunakan timeit
Sejauh ini, kami telah mempelajari dua pendekatan untuk membalikkan string Python. Tapi siapa di antara mereka yang lebih cepat? Ayo cari tahu.
Dalam contoh sebelumnya di mana kami mengatur waktu ekspresi Python sederhana, kami tidak memiliki kode setup
apa pun. Di sini, kami membalikkan string Python. Sementara operasi pembalikan string berjalan untuk beberapa kali yang ditentukan oleh number
, kode setup
adalah inisialisasi string yang hanya akan berjalan sekali.
>>> import timeit >>> timeit.timeit(stmt = 'string_1[::-1]', setup = "string_1 = 'Python'", number = 100000) 0.04951830000001678 >>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000) 0.12858760000000302
Untuk jumlah proses yang sama untuk membalikkan string yang diberikan, pendekatan pemotongan string lebih cepat daripada menggunakan metode join()
dan fungsi reversed()
.
Mengatur Waktu Fungsi Python Menggunakan timeit
Di bagian ini, mari pelajari cara mengatur waktu fungsi Python dengan fungsi timeit. Diberikan daftar string, fungsi berikut hasDigit
mengembalikan daftar string yang memiliki setidaknya satu digit.
def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit
Sekarang kita ingin mengukur waktu eksekusi fungsi Python hasDigit()
ini menggunakan timeit
.
Pertama-tama mari kita kenali pernyataan yang akan dihitung waktunya ( stmt
). Ini adalah panggilan ke fungsi hasDigit()
dengan daftar string sebagai argumen. Selanjutnya, mari kita tentukan kode penyiapan . Bisakah Anda menebak seperti apa kode setup
?
Agar pemanggilan fungsi berjalan dengan sukses, kode penyiapan harus menyertakan yang berikut ini:
- Definisi fungsi
hasDigit()
- Inisialisasi daftar argumen string
Mari tentukan kode penyiapan dalam string setup
, seperti yang ditunjukkan di bawah ini:
setup = """ def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit thislist=['puffin3','7frost','blue'] """
Selanjutnya, kita dapat menggunakan fungsi timeit
dan mendapatkan waktu eksekusi dari fungsi hasDigit()
untuk 100000 run.
import timeit timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
# Output 0.2810094920000097
Kesimpulan
Anda telah mempelajari cara menggunakan fungsi timeit Python untuk mengatur waktu ekspresi, fungsi, dan callable lainnya. Ini dapat membantu Anda membandingkan kode Anda, membandingkan waktu eksekusi implementasi yang berbeda dari fungsi yang sama, dan banyak lagi.
Mari tinjau apa yang telah kita pelajari dalam tutorial ini. Anda dapat menggunakan fungsi timeit()
dengan sintaks timeit.timeit(stmt=...,setup=...,number=...)
. Alternatifnya, Anda dapat menjalankan timeit di baris perintah untuk mengatur waktu cuplikan kode singkat.
Sebagai langkah selanjutnya, Anda dapat menjelajahi cara menggunakan paket profil Python lainnya seperti line-profiler dan memprofiler untuk membuat profil kode Anda masing-masing untuk waktu dan memori.
Selanjutnya, pelajari cara menghitung selisih waktu dengan Python.