چگونه میتوان سرعت اجرا و جزییات اجرای یک اسکریپت پایتون را بدست آورد؟
پروفایلینگ اسکریپت پایتون به ما این امکان را میدهد که عملکرد برنامه را بررسی کرده و نقاط قابل بهبود را شناسایی کنیم. ابزار اصلی برای این کار در پایتون cProfile نامیده میشود. این پروفایلر نه تنها زمان کل اجرای برنامه، بلکه زمان هر تابع و تعداد دفعات فراخوانی آنها را نیز ارائه میدهد، که این اطلاعات کلیدی در شناسایی بخشهایی است که ممکن است نیاز به بهینهسازی داشته باشند.
برای شروع میتوانید cProfile را به سادگی به یکی از دو روش زیر از درون کد خود یا از طریق خط فرمان فراخوانی کنید:
1. درون کد:
import cProfile
cProfile.run('foo()')
2. از خط فرمان:
python -m cProfile myscript.py
این روش به شما امکان میدهد که پروفایلر را به راحتی روی اسکریپتها یا ماژولهای مختلف اجرا کنید.
اگر بخواهید استفاده بیشتری از پروفایلر داشته باشید، میتوانید با نوشتن یک فایل بچ به نام profile.bat، روند را سادهتر کنید:
python -m cProfile %1
سپس با اجرای دستور زیر، به سرعت میتوانید پروفایل کنید:
profile euler048.py
خروجی ممکن است شبیه به این باشد:
1007 function calls in 0.061 CPU seconds
...
برای کسانی که به دنبال دید بهتری از روند پروفایلینگ هستند، ابزار دیگری به نام PyCallGraph موجود است. این ابزار میتواند نمودارهای بصری از فراخوانیهای تابع در کد شما تولید کند. بعد از نصب این ابزار از طریق pip و GraphViz، میتوانید به راحتی آن را از خط فرمان اجرا کنید:
pycallgraph graphviz -- ./mypythonscript.py
یا میتوانید بخش خاصی از کد خود را پروفایل کنید:
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()):
code_to_profile()
توجه داشته باشید که پروفایلر بهطور پیشفرض فقط در نخ اصلی کار میکند و اطلاعاتی درباره نخهای دیگر ارائه نمیدهد. اگر استفاده از نخها در برنامهتان رایج است، میتوانید از تابع threading.setprofile() استفاده کنید.
در صورتی که خواسته باشید پروفایلر را برای تردهای برنامه خود سفارشی کنید، میتوانید یک کلاس ProfiledThread ایجاد کنید که بر اساس کلاس Thread تعریف شده و پروفایلینگ را انجام دهد. به هر حال، این کار ممکن است در شرایط خاص مفید باشد و در واقع برای کدهای شخص ثالث چندان توصیه نمیشود.