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:

enter image description here


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:

gprof2dot example output


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.

enter image description here


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.

enter image description here


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:

Screenshot of the result


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.

heatmap


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