Dokumentasi
Instrumen Pyin adalah profiler Python. Profiler adalah alat untuk membantu Anda mengoptimalkan kode - membuatnya lebih cepat. Untuk mendapatkan peningkatan kecepatan terbesar, Anda harus fokus pada bagian paling lambat dari program Anda. Instrumen Pyin membantu Anda menemukannya!
☕️ Tidak yakin harus mulai dari mana? Lihat tutorial video ini dari calmcode.io!
pip install pyinstrument
Instrumen Pyin mendukung Python 3.8+.
Untuk menjalankan Pyinstrument dari git checkout, ada langkah pembuatan. Lihat Berkontribusi untuk informasi lebih lanjut.
Untuk mempelajari cara menggunakan instrumen pi, atau untuk memeriksa referensi, buka dokumentasi.
pyinstrument script.py
di mana script.py
berisi kelas yang diserialisasikan dengan pickle
, Anda mungkin mengalami kesalahan karena mesin serialisasi tidak mengetahui di mana __main__
berada. Lihat masalah ini untuk mencari solusinya 11 Oktober 2024
Banyak perbaikan pada penyaji HTML!
Mode Garis Waktu - lihat dan perbesar garis waktu linier interaktif!
Mode HTML sekarang memiliki opsi interaktif, daripada perlu mengaturnya terlebih dahulu.
Menyederhanakan desain header halaman HTML.
Tampilan tumpukan Panggilan HTML mendukung navigasi tombol panah.
Cara mendeteksi kode 'perpustakaan' telah diubah. Sebelumnya, jika string '/lib/' muncul di jalur file, itu dianggap sebagai kode perpustakaan (dan diciutkan secara default). Sekarang, instrumen pyin menangkap jalur instalasi Python dan virtualenv/conda env aktif apa pun pada waktu profil. File yang disimpan di sana dianggap perpustakaan. Hal ini akan memberikan lebih sedikit hasil positif palsu.
Panggilan ke profiler.start() kini dapat meneruskan parameter target_description, yang ditampilkan dalam pembacaan profil.
Periksa posting blog saya untuk info lebih lanjut tentang fitur baru.
6 September 2024
glom
pada Python 3.12 atau lebih baru, yang mengubah dikt locals(). (#336)UnicodeDecodeError
pada beberapa platform (#330)5 Agustus 2024
2 Agustus 2024
1 Agustus 2024
with
, atau dekorator fungsi/metode. Ini akan membuat profil kode dan mencetak pembacaan singkat ke terminal. (#327)flat
pada keluaran konsol, untuk menampilkan daftar fungsi datar (#294)26 Januari 2024
show_all
ke Profiler.output_html8 November 2023
%pyinstrument
sihir IPython (#278)12 Oktober 2023
-c
, yang memungkinkan pembuatan profil kode langsung dari baris perintah, seperti python -c
. (#271)Profiler.write_html
, untuk menulis output HTML ke file secara langsung. (#266)7 September 2023
1 September 2023
22 Juli 2023
[X frames hidden]
pada keluaran ketika bingkai dihapus karena __tracebackhide__
(#255)None
dalam keluaran konsol (#254)5 Juni 2023
-p flat
pada baris perintah. Mode ini menampilkan frame terberat yang diukur dengan waktu mandiri, yang dapat berguna di beberapa basis kode. (#240)pstats
. Ini adalah format file yang digunakan oleh cprofile di stdlib. Ini kurang detail dibandingkan profil instrumen pi, tetapi kompatibel dengan lebih banyak alat. (#236)--show-all
- pyinstrument tidak akan lagi menghapus frame internal Python saat opsi ini disediakan. (#239)5 November 2022
__traceback_hide__
sekarang akan dihapus dari keluaran (#217)--async_mode=enabled
. (#212)21 Agustus 2022
--interval
(detik, default 0,001) untuk mengubah interval waktu pengambilan sampel program oleh pyinstrument. Hal ini berguna untuk program yang berjalan lama, di mana peningkatan interval akan mengurangi overhead memori. Menambahkan opsi baris perintah -p
--render-option
yang memungkinkan pengaturan opsi render secara sewenang-wenang. Ini memungkinkan Anda menyetel opsi seperti filter_threshold
dari baris perintah, dengan melakukan sesuatu seperti pyinstrument -p processor_options.filter_threshold=0
.
Berikut keluaran bantuan untuk opsi ini:
-p RENDER_OPTION, --render-option=RENDER_OPTION
options to pass to the renderer, in the format
'flag_name' or 'option_name=option_value'. For
example, to set the option 'time', pass '-p
time=percent_of_total'. To pass multiple options, use
the -p option multiple times. You can set processor
options using dot-syntax, like '-p
processor_options.filter_threshold=0'. option_value is
parsed as a JSON value or a string.
Menambahkan kemampuan untuk melihat waktu di keluaran konsol sebagai persentase, bukan waktu absolut. Gunakan opsi ConsoleRenderer time='percent_of_total'
, atau pada baris perintah, gunakan -p
, seperti pyinstrument -p time=percent_of_total
.
Menambahkan opsi baris perintah untuk memuat dan menyimpan sesi instrumen py. Anda dapat menyimpan data mentah untuk sesi pyinstrument dengan -r session
, seperti pyinstrument -r session -o session.pyisession myscript.py
. Pemuatan dilakukan melalui --load
, misalnya pyinstrument --load session.pyisession
.
Format keluaran baris perintah disimpulkan dari ekstensi file keluaran -o
. Jadi jika Anda melakukan pyinstrument -o profile.html myscript.py
, Anda tidak perlu menyediakan -r html
, pyinstrument akan secara otomatis menggunakan penyaji HTML. Atau jika Anda melakukan pyinstrument -o profile.pyisession myscript.py
, itu akan menyimpan objek sesi mentah.
Menambahkan contoh penggunaan FastAPI dan pytest ke dokumentasi.
Memperbaiki bug yang menyebabkan NotImplementedError saat menggunakan async_mode=strict
.
Menambahkan dukungan untuk Python 3.11
%load_ext pyinstrument
di bagian atas buku catatan Anda, lalu %%pyinstrument
di sel yang ingin Anda profilkan.pyinstrument -r speedscope
, dan unggah ke aplikasi web speedscope.PYINSTRUMENT_PROFILE_DIR_RENDERER
.Dukungan asinkron! Pyinstrument sekarang mendeteksi ketika tugas asinkron mencapai menunggu, dan melacak waktu yang dihabiskan di luar konteks asinkron dalam menunggu ini.
Jadi, misalnya, inilah skrip sederhana dengan tugas asinkron yang melakukan mode tidur:
import asyncio
from pyinstrument import Profiler
async def main ():
p = Profiler ( async_mode = 'disabled' )
with p :
print ( 'Hello ...' )
await asyncio . sleep ( 1 )
print ( '... World!' )
p . print ()
asyncio . run ( main ())
Sebelum Pyinstrument 4.0.0, kita hanya melihat waktu yang dihabiskan dalam run loop, seperti ini:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:33:03 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.006 CPU time: 0.001
/ _/ v3.4.2
Program: examples/async_example_simple.py
1.006 _run_once asyncio/base_events.py:1784
└─ 1.005 select selectors.py:553
[3 frames hidden] selectors,
1.005 kqueue.control :0
Sekarang, dengan piinstrument 4.0.0, kita mendapatkan:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:30:43 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.007 CPU time: 0.001
/ _/ v4.0.0
Program: examples/async_example_simple.py
1.006 main async_example_simple.py:4
└─ 1.005 sleep asyncio/tasks.py:641
[2 frames hidden] asyncio
1.005 [await]
Untuk informasi lebih lanjut, lihat dokumentasi pembuatan profil async dan properti Profiler.async_mode.
Pyinstrument memiliki situs dokumentasi, termasuk dokumen lengkap Python API!
--show
, --show-regex
, --show-all
diabaikan pada baris perintah.timeline
(boolean) ke metode Profiler output_html()
dan open_in_browser()
.pyinstrument -m module
, di mana pyinstrument tidak menemukan modul di direktori saat ini.Python -> C -> Python
dicatat sebagai Python -> Python
, tetapi Python -> Python -> C
akan diatribusikan dengan benar. (#103)<__array_function__ internals>
yang muncul sebagai kode aplikasi dalam laporan--show
dan --show-regex
, untuk menandai file tertentu yang akan ditampilkan. Ini membantu untuk membuat profil di dalam modul tertentu, sambil menyembunyikan yang lain. Misalnya, pyinstrument --show '*/sympy/*' script.py
.Pyinstrument sekarang akan menyembunyikan jejak melalui perpustakaan yang Anda gunakan secara default. Jadi, alih-alih menunjukkan kepada Anda banyak bingkai yang melewati internal sesuatu yang eksternal misalnya urllib, ini memungkinkan Anda fokus pada kode Anda.
Sebelum | Setelah |
---|---|
Untuk kembali ke perilaku lama, gunakan --show-all
pada baris perintah.
Bingkai 'entri' grup tersembunyi ditampilkan, sehingga Anda tahu panggilan mana yang bermasalah
Frame yang sangat lambat dalam grup juga ditampilkan, misalnya panggilan 'baca' pada soket
Kode aplikasi disorot di konsol
Metrik tambahan ditampilkan di bagian atas jejak - stempel waktu, jumlah sampel, durasi, waktu CPU
Kode tersembunyi dikendalikan oleh opsi --hide
atau --hide-regex
- yang cocok dengan jalur file kode.
--hide=EXPR glob-style pattern matching the file paths whose
frames to hide. Defaults to '*/lib/*'.
--hide-regex=REGEX regex matching the file paths whose frames to hide.
Useful if --hide doesn't give enough control.
Menghasilkan garis waktu didukung dari baris perintah.
-t, --timeline render as a timeline - preserve ordering and don't
condense repeated calls
Karena sekarang ada beberapa opsi rendering, Anda dapat memuat sesi pembuatan profil sebelumnya menggunakan --load-prev
- pyinstrument menyimpan 10 sesi terakhir.
Grup tersembunyi juga dapat memanggil kembali kode aplikasi, yang terlihat seperti ini:
(internal) Saat merekam garis waktu, pohon bingkai sekarang sepenuhnya linier, memungkinkan pembuatan bagan bingkai super akurat.
(internal) Penyaji HTML telah ditulis ulang sebagai aplikasi Vue.js. Semua peningkatan konsol juga berlaku pada keluaran HTML, ditambah lagi interaktif.
(internal) Banyak pengujian unit dan integrasi ditambahkan!
Astaga! Lihat #49 untuk detail mengerikannya. Saya harap Anda menyukainya.
Recorders
telah dihapus. Perekaman bingkai sekarang berada di dalam objek Profiler
. Ini berarti objek 'bingkai' memiliki tujuan yang lebih umum, yang membuka jalan bagi...--version
Menambahkan dukungan untuk keluaran JSON. Gunakan pyinstrument --renderer=json scriptfile.py
. PR
@iddan telah membuat penampil interaktif menggunakan keluaran JSON!
Saat menjalankan pyinstrument --html
dan Anda tidak menyalurkan output ke file, pyinstrument akan menulis output konsol ke file temp dan membukanya di browser.
-m
misalnya pyinstrument -m module_name
! PR Instrumen Pyin sekarang dapat digunakan dalam blok with
.
Misalnya:
profiler = pyinstrument.Profiler()
with profiler:
# do some work here...
print(profiler.output_text())
Perbaikan middleware untuk versi lama Django
Pyinstrument menggunakan mode pembuatan profil baru . Daripada menggunakan sinyal, pyintrument menggunakan profiler statistik baru yang dibangun di PyEval_SetProfile. Ini berarti tidak ada lagi pembatasan thread utama, tidak ada lagi kesalahan IO saat menggunakan instrumen Pyin, dan tidak perlu lagi mode 'setprofile' yang terpisah!
Penyaji . Pengguna dapat menyesuaikan Pyinstrument untuk menggunakan penyaji alternatif dengan argumen renderer
di Profiler.output()
, atau menggunakan argumen --renderer
pada baris perintah.
Perekam . Untuk mendukung kasus penggunaan Pyinstrument lainnya (misalnya diagram api), pyinstrument kini memiliki mode perekam 'timeline'. Mode ini merekam frame yang diambil secara linier, sehingga eksekusi program dapat dilihat pada timeline.
pyinstrument
. Anda sekarang dapat membuat profil skrip python dari shell dengan menjalankan $ pyinstrument script.py
. Ini sekarang setara dengan python -m pyinstrument
. Terima kasih @asmeurer!Kode aplikasi disorot dalam jejak HTML agar lebih mudah dikenali
Menambahkan opsi PYINSTRUMENT_PROFILE_DIR
ke antarmuka Django, yang akan mencatat profil semua permintaan ke berkas folder tertentu. Berguna untuk membuat profil panggilan API.
Menambahkan opsi PYINSTRUMENT_USE_SIGNAL
ke antarmuka Django, untuk digunakan ketika mode sinyal menimbulkan masalah.
Untuk menyiapkan lingkungan pengembang:
virtualenv --python=python3 env
. env/bin/activate
pip install --upgrade pip
pip install -r requirements-dev.txt
pre-commit install --install-hooks
Untuk mendapatkan beberapa contoh keluaran:
pyinstrument examples/wikipedia_article_word_count.py
Untuk menjalankan tes:
pytest
Untuk menjalankan pemeriksaan linting secara lokal:
pre-commit run --all-files
Beberapa pemeriksaan pra-komit, seperti isort
atau black
, akan memperbaiki masalah yang ditemukan secara otomatis. Jadi jika perintah di atas kembali error, coba jalankan lagi, mungkin berhasil untuk kedua kalinya :)
Menjalankan semua pemeriksaan bisa jadi lambat, jadi Anda juga bisa menjalankan pemeriksaan satu per satu, misalnya untuk memformat kode sumber yang gagal isort
atau pemeriksaan black
:
pre-commit run --all-files isort
pre-commit run --all-files black
Untuk mendiagnosis mengapa pemeriksaan pyright
gagal:
pre-commit run --all-files pyright
Penyaji HTML bekerja dengan menyematkan representasi JSON dari sampel dengan 'bundel' Javascript di dalam file HTML yang dapat dilihat di browser web apa pun.
Untuk mengedit gaya penyaji html, lakukan:
cd html_renderer
npm ci
npm run serve
Saat diluncurkan tanpa objek window.profileSession
tingkat atas, ia akan mengambil profil sampel sehingga Anda dapat mengerjakannya.
Untuk mengkompilasi aplikasi JS dan menggabungkannya kembali ke alat python pyinstrument:
bin/build_js_bundle.py [--force]