Profiling a Python Script with cProfile

Python Profiling Your Code

SU

Python Skriptini cProfile Bilan Profiling Qilish

Kod yozishda har doim ba'zi funksiyalar boshqalardan sekin bo'lishi mumkin. Sezilarli sekin funksiyalarni simulyatsiya qilishning bir usuli - Pythonning time modulidan foydalanishdir, bu modulda sleep() funksiyasi mavjud.

Keling, profile_test.py deb nomlangan bir dastur yozaylik, unda turli miqdorlarda vaqtni kutadigan bir nechta funksiyalar mavjud:

# profile_test.py
 
import time
 
def quick():
    print('Running quick')
    return 1 + 1
 
def average():
    print('Running average')
    time.sleep(0.5)
 
def super_slow():
    print('Running super slowly')
    time.sleep(2)
 
def main():
    quick()
    super_slow()
    quick()
    average()
 
if __name__ == '__main__':
    main()

Bu yerda to'rt ta funksiya mavjud:

  • quick() - sleep() ishlatmaydi
  • average() - yarim soniya kutadi
  • super_slow() - 2 soniya kutadi
  • main() - dasturingizning asosiy kirish nuqtasi

main() funksiyasi dasturingizdagi barcha boshqa funksiyalarni ishga tushiradi va quick() ni ikki marta chaqiradi.

Siz bu kodni avvalgi bo'limda ko'rsatilganidek, cProfile yordamida profiling qilishingiz mumkin:

>>> import profile_test
>>> import cProfile
>>> cProfile.run("profile_test.main()")

Chiqishi quyidagicha bo'ladi:

Running quick
Running super slowly
Running quick
Running average
14 function calls in 2.505 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1      0.000    0.000    2.505    2.505    <string>:1(<module>)
1      0.000    0.000    2.003    2.003    profile_test.py:13(super_slow)
1      0.000    0.000    2.505    2.505    profile_test.py:17(main)
2      0.000    0.000    0.000    0.000    profile_test.py:5(quick)
1      0.000    0.000    0.502    0.502    profile_test.py:9(average)
1      0.000    0.000    2.505    2.505    {built-in method builtins.exec}
4      0.000    0.000    0.000    0.000    {built-in method builtins.print}
2      2.505    1.253    2.505    1.253    {built-in method time.sleep}
1      0.000    0.000    0.000    0.000    {method 'disable' of '_lsprof.Profiler'}

Bu chiqishdan quick() funksiyasining ikki marta chaqirilganini ko'rish mumkin. Shuningdek, print() funksiyasi to'rt marta chaqirilgan, va time.sleep() funksiyasi ikki marta chaqirilgan. Boshqa hamma narsa bir marta chaqirilgan. Eslatib o'tish joizki, bu kodni qaysi shellda ishga tushirayotganingizga qarab, ko'proq chiqish olishingiz mumkin. Ammo agar siz standart Python konsolidan foydalansangiz, yuqoridagi chiqishga o'xshash natija ko'rishingiz kerak.

super_slow() funksiyasi 2 soniya davomida ishladi, average() funksiyasi esa 0.5 soniya davomida ishladi. main() funksiyasi barcha boshqa funksiyalarni chaqirganligi sababli, 2.5 soniyadan biroz ko'proq vaqt talab qildi.

Ushbu ma'lumotni tahlil qilish orqali, average() va super_slow() funksiyalariga e'tibor qaratishingiz kerakligini ko'rishingiz mumkin, chunki ularni optimallashtirish dasturingizni tezlashtirishga yordam beradi.

Shuningdek, quyidagi tarzda komanda qatorida ham kodni profiling qilishingiz mumkin:

$ python -m cProfile profile_test.py

Chiqish yuqoridagi chiqishga juda o'xshash bo'ladi.

Agar xohlasangiz, cProfile chiqishini faylga saqlashni ham sozlashingiz mumkin. Buning uchun -o flag'idan foydalaning:

$ python -m cProfile -o profile_output.txt profile_test.py

Bu yerda profiling chiqishini profile_output.txt nomli faylga saqlaysiz. Agar bu faylni matn tahrirlovchisida ochishga harakat qilsangiz, u inson o'qishiga yaroqsiz bo'ladi.

Faylni o'qish va tahlil qilish uchun Pythonning pstats modulidan foydalanishingiz kerak. Keyingi bo'limda shuni qanday amalga oshirishni ko'rib chiqamiz!

Last updated on

On this page

Xato haqida xabar berish