Pertanyaan Bagaimana Anda bisa membuat profil naskah?
Proyek Euler dan kontes pengkodean lainnya sering kali memiliki waktu maksimum untuk dijalankan atau orang-orang membanggakan seberapa cepat solusi khusus mereka berjalan. Dengan python, terkadang pendekatannya agak kludgey - yaitu, menambahkan kode waktu ke __main__
.
Apa cara yang baik untuk menentukan berapa lama program python dibutuhkan untuk dijalankan?
973
2018-02-24 16:01
asal
Jawaban:
Python termasuk profiler yang disebut cProfile. Ini tidak hanya memberikan total waktu berjalan, tetapi juga waktu masing-masing berfungsi secara terpisah, dan memberi tahu Anda berapa kali setiap fungsi dipanggil, membuatnya mudah untuk menentukan di mana Anda harus melakukan pengoptimalan.
Anda dapat memanggilnya dari dalam kode Anda, atau dari interpreter, seperti ini:
import cProfile
cProfile.run('foo()')
Bahkan lebih bermanfaat lagi, Anda dapat menjalankan cProfile saat menjalankan skrip:
python -m cProfile myscript.py
Untuk membuatnya lebih mudah, saya membuat file batch kecil yang disebut 'profile.bat':
python -m cProfile %1
Jadi yang harus saya lakukan adalah menjalankan:
profile euler048.py
Dan saya mendapatkan ini:
1007 function calls in 0.061 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.061 0.061 <string>:1(<module>)
1000 0.051 0.000 0.051 0.000 euler048.py:2(<lambda>)
1 0.005 0.005 0.061 0.061 euler048.py:2(<module>)
1 0.000 0.000 0.061 0.061 {execfile}
1 0.002 0.002 0.053 0.053 {map}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler objects}
1 0.000 0.000 0.000 0.000 {range}
1 0.003 0.003 0.003 0.003 {sum}
EDIT: Tautan yang diperbarui ke sumber video yang bagus dari PyCon 2013 berjudul
Profil Python
Juga melalui YouTube.
1073
2018-02-24 16:01
Beberapa waktu yang lalu saya buat pycallgraph
yang menghasilkan visualisasi dari kode Python Anda. Edit: Saya telah memperbarui contoh untuk bekerja dengan rilis terbaru.
Setelah pip install pycallgraph
dan menginstal GraphViz Anda dapat menjalankannya dari baris perintah:
pycallgraph graphviz -- ./mypythonscript.py
Atau, Anda dapat profil bagian tertentu dari kode Anda:
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()):
code_to_profile()
Salah satu dari ini akan menghasilkan pycallgraph.png
file mirip dengan gambar di bawah ini:

349
2017-08-06 05:37
Penting untuk menunjukkan bahwa menggunakan profiler hanya berfungsi (secara default) pada utas utama, dan Anda tidak akan mendapatkan informasi apa pun dari untaian lain jika Anda menggunakannya. Ini bisa menjadi sedikit gotcha karena benar - benar tidak disebutkan di dokumentasi profiler.
Jika Anda juga ingin membuat profil utas, Anda akan ingin melihat threading.setprofile()
fungsi dalam dokumen.
Anda juga bisa membuatnya sendiri threading.Thread
subclass untuk melakukannya:
class ProfiledThread(threading.Thread):
# Overrides threading.Thread.run()
def run(self):
profiler = cProfile.Profile()
try:
return profiler.runcall(threading.Thread.run, self)
finally:
profiler.dump_stats('myprofile-%d.profile' % (self.ident,))
dan gunakan itu ProfiledThread
kelas bukan yang standar. Ini mungkin memberi Anda lebih banyak fleksibilitas, tapi saya tidak yakin itu layak, terutama jika Anda menggunakan kode pihak ketiga yang tidak akan menggunakan kelas Anda.
167
2017-12-17 16:30
Wiki python adalah laman hebat untuk profil sumber daya:
http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
seperti dokumen python:
http://docs.python.org/library/profile.html
seperti yang ditunjukkan oleh Chris Lawlor cProfile adalah alat yang hebat dan dapat dengan mudah digunakan untuk mencetak ke layar:
python -m cProfile -s time mine.py <args>
atau file:
python -m cProfile -o output.file mine.py <args>
PS> Jika Anda menggunakan Ubuntu, pastikan untuk menginstal profil python
sudo apt-get install python-profiler
Jika Anda output ke file Anda bisa mendapatkan visualisasi yang bagus menggunakan alat-alat berikut
PyCallGraph: alat untuk membuat gambar grafik panggilan
memasang:
sudo pip install pycallgraph
menjalankan:
pycallgraph mine.py args
melihat:
gimp pycallgraph.png
Anda dapat menggunakan apa pun yang Anda suka untuk melihat file png, saya menggunakan gimp
Sayangnya saya sering mendapatkannya
dot: grafik terlalu besar untuk bitmap cairo-renderer. Scaling dengan 0,257079 agar sesuai
yang membuat gambar saya tidak terlalu kecil. Jadi saya biasanya membuat file svg:
pycallgraph -f svg -o pycallgraph.svg mine.py <args>
PS> pastikan untuk menginstal graphviz (yang menyediakan program dot):
sudo pip install graphviz
Alternatif Graphing menggunakan gprof2dot via @maxy / @quodlibetor:
sudo pip install gprof2dot
python -m cProfile -o profile.pstats mine.py
gprof2dot -f pstats profile.pstats | dot -Tsvg -o mine.svg
126
2017-10-08 00:04
@ Maxy mengomentari jawaban ini membantu saya cukup bahwa saya pikir itu layak untuk menjawabnya sendiri: Saya sudah memiliki file-file .pstats yang dibuat oleh cProfile dan saya tidak ingin menjalankan ulang hal-hal dengan pycallgraph, jadi saya menggunakan gprof2dot, dan mendapat svgs cantik:
$ sudo apt-get install graphviz
$ git clone https://github.com/jrfonseca/gprof2dot
$ ln -s "$PWD"/gprof2dot/gprof2dot.py ~/bin
$ cd $PROJECT_DIR
$ gprof2dot.py -f pstats profile.pstats | dot -Tsvg -o callgraph.svg
dan BLAM!
Ia menggunakan dot (hal yang sama dengan pycallgraph) sehingga output terlihat serupa. Saya mendapat kesan bahwa gprof2dot kehilangan sedikit informasi meskipun:

113
2017-12-11 23:16
Aku berlari ke alat yang berguna yang disebut SnakeViz ketika meneliti topik ini. SnakeViz adalah alat visualisasi profiling berbasis web. Sangat mudah dipasang dan digunakan. Cara yang biasa saya gunakan adalah membuat file stat dengan %prun
lalu lakukan analisis di SnakeViz.
Teknik utama yang digunakan adalah Bagan Sunburst seperti yang ditunjukkan di bawah ini, di mana hierarki fungsi panggilan diatur sebagai lapisan busur dan info waktu yang dikodekan dalam lebar sudutnya.
Yang terbaik adalah Anda bisa berinteraksi dengan grafik. Sebagai contoh, untuk memperbesar satu dapat mengklik pada busur, dan busur dan keturunannya akan diperbesar sebagai sunburst baru untuk menampilkan lebih banyak detail.

41
2018-05-25 08:06
Juga perlu disebutkan adalah penampil GUI cProfile dump RunSnakeRun. Ini memungkinkan Anda untuk mengurutkan dan memilih, sehingga memperbesar bagian-bagian yang relevan dari program. Ukuran persegi panjang dalam gambar sebanding dengan waktu yang digunakan. Jika Anda mengarahkan mouse ke persegi panjang, sorotannya akan muncul di meja dan di mana-mana di peta. Ketika Anda mengklik dua kali pada persegi panjang itu memperbesar pada bagian itu. Ini akan menunjukkan kepada Anda siapa yang memanggil bagian itu dan apa bagian yang dipanggil.
Informasi deskriptif sangat membantu. Ini menunjukkan kepada Anda kode untuk bit yang dapat membantu ketika Anda berurusan dengan panggilan perpustakaan built-in. Ini memberi tahu Anda apa file dan baris apa untuk menemukan kode.
Juga ingin menunjukkan bahwa OP mengatakan 'profil' tetapi tampaknya ia berarti 'waktu'. Ingatlah bahwa program akan berjalan lebih lambat ketika diprofilkan.

33
2018-02-22 16:18
Saya pikir itu cProfile
sangat bagus untuk profil, sementara kcachegrind
sangat bagus untuk memvisualisasikan hasilnya. Itu pyprof2calltree
di antara menangani konversi file.
python -m cProfile -o script.profile script.py
pyprof2calltree -i script.profile -o script.calltree
kcachegrind script.calltree
Untuk menginstal alat yang diperlukan (pada Ubuntu, setidaknya):
apt-get install kcachegrind
pip install pyprof2calltree
Hasil:

29
2018-05-11 08:32
pprofile
line_profiler
(sudah disajikan di sini) juga terinspirasi pprofile
, yang digambarkan sebagai:
Perincian baris, deterministik sadar-benang dan statistik pure-python
profiler
Ini memberikan perincian baris sebagai line_profiler
, adalah Python murni, dapat digunakan sebagai perintah mandiri atau modul, dan bahkan dapat menghasilkan file format-callgrind yang dapat dengan mudah dianalisis dengan [k|q]cachegrind
.
vprof
Ada juga vprof, paket Python yang dideskripsikan sebagai:
[...] menyediakan visualisasi yang kaya dan interaktif untuk berbagai karakteristik program Python seperti waktu berjalan dan penggunaan memori.

28
2018-03-02 11:36
Modul profil yang bagus adalah line_profiler (disebut menggunakan skrip kernprof.py). Ini bisa diunduh sini.
Pemahaman saya adalah bahwa cProfile hanya memberikan informasi tentang total waktu yang dihabiskan di setiap fungsi. Jadi baris kode individu tidak diberi batas waktu. Ini adalah masalah dalam komputasi ilmiah karena seringkali satu baris dapat memakan banyak waktu. Juga, seperti yang saya ingat, cProfile tidak menangkap waktu yang saya habiskan untuk mengatakan numpy.dot.
27
2017-10-20 16:05
Paling sederhana dan tercepat cara untuk menemukan kemana semua waktu berjalan.
1. pip install snakeviz
2. python -m cProfile -o temp.dat <PROGRAM>.py
3. snakeviz temp.dat
Menggambar diagram lingkaran di browser. Bagian terbesar adalah fungsi masalah. Sederhana.
14
2018-03-08 13:03