Ukur masa pemprosesan dengan modul timeit Python.

Perniagaan

Menggunakan modul timeit pustaka standard Python, anda boleh dengan mudah mengukur masa pelaksanaan proses dalam kod anda. Ini berguna untuk semakan pantas.

Dua kes berikut akan dibincangkan di sini.

  • Ukur dalam fail Python:timeit.timeit(),timeit.repeat()
  • Pengukuran dengan Buku Nota Jupyter:%timeit,%%timeit

Cara lain ialah menggunakan time.time() untuk mengukur masa yang telah berlalu dalam atur cara.

Pengukuran dalam fail Python: timeit.timeit(), timeit.repeat()

Sebagai contoh, kita akan mengukur masa pemprosesan fungsi mudah, test(n), yang mengira jumlah n nombor berturut-turut.

import timeit

def test(n):
    return sum(range(n))

n = 10000
loop = 1000

result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842

Jika anda menghantar kod yang anda ingin ukur sebagai rentetan kepada fungsi timeit.timeit(), ia akan dilaksanakan BILANGAN kali dan masa yang diambil akan dikembalikan.
Nilai lalai untuk nombor ialah 1,000,000. Ambil perhatian bahawa jika anda menggunakan nilai lalai untuk proses yang memakan masa, ia akan mengambil banyak masa.

Dengan melepasi globals() sebagai argumen global, kod tersebut akan dilaksanakan dalam ruang nama global.
Tanpa ini, ujian fungsi dan pembolehubah n tidak diiktiraf dalam contoh di atas.

Kod yang akan ditentukan boleh menjadi objek boleh dipanggil dan bukannya rentetan, jadi ia boleh ditentukan sebagai ungkapan lambda tanpa hujah; dalam kes ini, hujah globals tidak perlu dinyatakan.

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

Unit keputusan ialah saat. Di sini, output ialah masa pemprosesan setiap pelaksanaan dibahagikan dengan bilangan pelaksanaan.

Jika anda tidak membahagikan, nilai hasil akan menjadi lebih besar apabila anda meningkatkan bilangan pelaksanaan.

print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038

Menggunakan fungsi timeit.repeat(), timeit() boleh dilaksanakan berulang kali. Hasilnya akan diperolehi sebagai senarai.

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

Pengukuran dengan Buku Nota Jupyter:%timeit, %%timeit

Dalam Jupyter Notebook (IPython), anda boleh menggunakan arahan ajaib berikut; tidak perlu mengimport modul timeit.

  • %timeit
  • %%timeit

%timeit

Dalam %timeit, nyatakan kod sasaran yang dipisahkan oleh ruang seperti argumen baris arahan.

Secara lalai, nombor dan ulangan dalam timeit.timeit() ditentukan secara automatik. Anda juga boleh menentukannya dengan pilihan -n dan -r.

Keputusan dikira sebagai min dan sisihan piawai.

%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

%%timeit

Perintah ajaib %%timeit boleh digunakan untuk mengukur masa pemprosesan keseluruhan sel.

Sebagai contoh, mari kita jalankan proses yang sama menggunakan NumPy. Pilihan -n dan -r boleh diabaikan.

Memandangkan kami mengukur masa pemprosesan keseluruhan sel, contoh berikut termasuk masa untuk mengimport NumPy.

%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

Tidak perlu menentukan kod sasaran sebagai hujah untuk %%timeit. Apa yang anda perlu lakukan ialah menulis %%timeit pada permulaan sel, jadi ia adalah yang paling mudah untuk digunakan.

Copied title and URL