Apa% timeit di python?

97

Saya selalu membaca kodenya untuk menghitung waktu seperti ini:

%timeit function()

Bisakah Anda menjelaskan apa artinya "%" di sini?

Menurut saya, "%" selalu digunakan untuk mengganti sesuatu dalam string, seperti% s berarti mengganti string,% d mengganti data, tapi saya tidak tahu tentang kasus ini.

xirururu
sumber
16
Itu adalah perintah ajaib dari iPython. Lihat: iPython Magics
MrAlexBailey

Jawaban:

91

%timeitadalah fungsi ajaib ipython , yang dapat digunakan untuk mengatur waktu bagian kode tertentu (Pernyataan eksekusi tunggal, atau metode tunggal).

Dari dokumen:

% waktu itu

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

Untuk menggunakannya, misalnya jika kita ingin mengetahui apakah menggunakan xrangelebih cepat daripada menggunakan range, Anda cukup melakukan:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

Dan Anda akan mendapatkan pengaturan waktu untuk mereka.

Keuntungan utama dari %timeitadalah:

  • bahwa Anda tidak perlu mengimpor timeit.timeit dari pustaka standar , dan menjalankan kode beberapa kali untuk mencari tahu pendekatan mana yang lebih baik.

  • % timeit secara otomatis akan menghitung jumlah proses yang diperlukan untuk kode Anda berdasarkan total jendela eksekusi 2 detik.

  • Anda juga dapat menggunakan variabel konsol saat ini tanpa meneruskan seluruh cuplikan kode seperti dalam kasus timeit.timeituntuk membuat variabel yang dibangun di lingkungan lain yang waktu itu berfungsi.

mu 無
sumber
1
apakah ada cara untuk mengatur waktu makro atau serangkaian baris dari shell ipython?
alpha_989
2
@ alpha_989 Ya, Anda dapat menggabungkan kumpulan baris tersebut dalam sebuah fungsi, dan kemudian mengatur waktu fungsinya seperti:%timeit function()
mu 無
@mu 無: Harap jelaskan timer.timeit- apakah itu nama modul yang sebenarnya?
Fountainhead
2
@fountainhead: docs.python.org/3/library/timeit.html#timeit.timeit
Sasha Chedygov
output 10000 loops, best of 3: 29.6 µs per loopdapat diartikan sebagai: (1.) ekspresi dijalankan 10000 kali untuk mendapatkan total waktu (2.) kemudian total waktu dibagi dengan 10000 untuk mendapatkan waktu "per loop" dan (3.) total waktu komputasi selesai 3 kali dan terakhir (4.) dari 3 waktu total, total waktu minimum (alias "terbaik dari 3") digunakan sebagai output. apakah interpretasi saya benar, ya / tidak?
Trevor Boyd Smith
37

Ini dikenal sebagai sihir garis di iPython. Mereka unik karena argumen mereka hanya meluas ke akhir baris saat ini, dan sihir itu sendiri benar-benar terstruktur untuk pengembangan baris perintah. timeitdigunakan untuk mengatur waktu eksekusi kode.

Jika Anda ingin melihat semua sihir yang dapat Anda gunakan, Anda cukup mengetik:

%lsmagic

untuk mendapatkan daftar sihir garis dan sihir sel.

Beberapa informasi ajaib lebih lanjut dari dokumentasi di sini :

IPython memiliki sistem perintah yang kami sebut magics yang secara efektif menyediakan bahasa perintah mini yang ortogonal dengan sintaks Python dan dapat dikembangkan oleh pengguna dengan perintah baru. Magics dimaksudkan untuk diketik secara interaktif, sehingga mereka menggunakan konvensi baris perintah, seperti menggunakan spasi untuk memisahkan argumen, tanda hubung untuk opsi dan konvensi lain yang khas dari lingkungan baris perintah.

Bergantung pada apakah Anda dalam mode garis atau sel , ada dua cara berbeda untuk menggunakan %timeit. Pertanyaan Anda menggambarkan cara pertama:

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :
miradulo
sumber
2

Saya hanya ingin menambahkan keuntungan berguna lainnya menggunakan% timeit untuk menjawab dengan mu 無bahwa:

  • Anda juga dapat menggunakan variabel konsol saat ini tanpa meneruskan seluruh cuplikan kode seperti pada timeit.timeit untuk membuat variabel yang dibangun di lingkungan lain tempat timeit berfungsi.

PS: Saya tahu ini harus menjadi komentar untuk menjawab di atas tetapi saya saat ini tidak memiliki reputasi yang cukup untuk itu, semoga apa yang saya tulis akan bermanfaat bagi seseorang dan membantu saya mendapatkan reputasi yang cukup untuk berkomentar di lain waktu.

Ankit Agrawal
sumber
1
Anda juga dapat mengedit jawaban orang lain untuk memperbaikinya. Anda seharusnya sudah memiliki reputasi yang cukup untuk itu
Tarick Welling
Terima kasih tidak tahu itu. @TarickWelling
Ankit Agrawal
2

Saya hanya ingin menambahkan poin yang sangat halus tentang %% waktu itu. Mengingat itu menjalankan "magics" di sel , Anda akan mendapatkan kesalahan ...

UsageError: Fungsi garis ajaib %%timeittidak ditemukan

... jika ada kode / baris komentar di atas %% timeit. Dengan kata lain, pastikan bahwa %% timeit adalah perintah pertama di sel Anda.

Aku tahu itu poin kecil yang semua ahli akan katakan ya, tapi hanya ingin menambahkan setengah senku untuk penyihir muda yang memulai dengan trik sulap.

sukses
sumber
1
Ini tidak berlaku di shell iPython, hanya di notebook
Jupyter
0

Magics baris diawali dengan karakter % dan berfungsi seperti panggilan baris perintah OS: mereka mendapatkan argumen di baris lainnya, di mana argumen diteruskan tanpa tanda kurung atau tanda kutip. Sihir sel diawali dengan %% ganda , dan merupakan fungsi yang tidak hanya dijadikan argumen di baris lainnya, tetapi juga baris di bawahnya dalam argumen terpisah.

Mohammad Salehi
sumber