GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||
GeezerVison is showing python.github.io — profiling --- پروفایلگیرهای پایتون
|
ویژگی |
نمونهبرداری آماری ( |
قطعی ( |
|---|---|---|
سربار |
عملاً صفر |
متوسط |
دقت |
برآورد آماری |
تعداد دقیق فراخوانیها |
قالبهای خروجی |
pstats، نمودار شعلهای (flame graph)، نقشهی حرارتی (heatmap)، gecko، فشردهشده (collapsed) |
pstats |
حالتهای پروفایلگیری |
زمان دیوار (Wall-clock)، پردازنده، GIL |
زمان دیوار (Wall-clock) |
قابهای ویژه |
مدیریت حافظه (GC)، بومی (پسوندهای C) |
ناموجود |
اتصال به PID |
بله |
خیر |
پروفایلگیر آماری (profiling.sampling) برای بیشتر وظایف تحلیل کارایی پیشنهاد میشود. از آن درست مانند profiling.tracing استفاده کنید:
python -m profiling.sampling run script.py
یکی از نقاط قوت اصلی پروفایلگیر نمونهبرداری، تنوع قالبهای خروجی آن است. فراتر از جدولهای سنتی pstats، این ابزار میتواند نمودارهای شعلهای تعاملی تولید کند که سلسلهمراتب فراخوانی را مصورسازی میکنند، نقشههای حرارتی منبع در سطح سطر که دقیقاً نشان میدهند زمان در کک شما کجا صرف شده است، و خروجی پروفایلگیر فایرفاکس را برای تحلیل مبتنی بر خط زمانی فراهم کند.
این پروفایلگیر همچنین بینشی نسبت به رفتار مفسر پایتون فراهم میکند که پروفایلگیری قطعی نمیتواند ثبت کند. از --mode gil برای شناسایی رقابت بر سر GIL در کد چندنخی، از --mode cpu برای اندازهگیری زمان واقعی پردازنده به غیر از انتظارهای I/O، یا بررسی قابهای <GC> برای درک سربار زبالهروبی استفاده کنید. گزینهی --native زمان صرفشده در پسوندهای C را آشکار میکند و به تفکیک سربار پایتون از کارایی کتابخانه کمک میکند.
برای برنامههای چندنخی، گزینهی -a همه نخها را بهطور همزمان نمونهبرداری میکند و نشان میدهد کار چگونه توزیع شده است. همچنین برای اشکالزدایی در محیط تولید، دستور attach به هر فرایند در حال اجرای پایتون از طریق PID متصل میشود بدون اینکه نیازی به راهاندازی مجدد یا تغییرات کد باشد.
پروفایلگیر قطعی (profiling.tracing) تمام فراخوانیها و بازگشتهای تابع را ابزارگذاری میکند. این رویکرد سربار بالاتری نسبت به نمونهبرداری دارد، اما پوشش کاملی از اجرای برنامه را تضمین میکند.
دلیل اصلی برای انتخاب پروفایلگیری قطعی زمانی است که به تعداد دقیق فراخوانیها نیاز دارید. پروفایلگیری آماری بسامد را بر اساس نمونهبرداری تخمین میزند، که ممکن است توابع عمرکوتاهی را که بین نمونهها کامل میشوند، کمتر از مقدار واقعی بشاند. اگر نیاز دارید تأیید کنید که یک بهینهسازی واقعاً تعداد فراخوانیهای تابع را کاهش داده است، یا اگر میخواهید گراف کامل فراخوانیها را برای درک روابط فراخواننده و فراخواندهشده ردگیری کنید، پروفایلگیری قطعی انتخاب درستی است.
پروفایلگیری قطعی همچنین در ثبت توابع کوتاهمدتی که در مایکروثانیهها اجرا میشوند عملکرد بسیار خوبی دارد. چنین توابعی ممکن است به اندازه کافی در نمونههای آماری ظاهر نشوند، اما پروفایلگیری قطعی هر فراخوانی را صرفنظر از مدتزمان آن ثبت میکند.
این بخش حداقل گامهای لازم برای شروع پروفایلگیری را ارائه میدهد. برای مستندات کامل، صفحات اختصاصی هر پروفایلگیر را ببینید.
برای پروفایلگیری یک اسکریپت، از ماژول profiling.sampling به همراه دستور run استفاده کنید:
python -m profiling.sampling run script.py python -m profiling.sampling run -m mypackage.module
این کار اسکریپت را تحت پروفایلگیر اجرا میکند و خلاصهای از محل صرف زمان را چاپ میکند. برای یک نمودار شعلهی تعاملی:
python -m profiling.sampling run --flamegraph script.py
برای پروفایلگیری یک فرایند در حال اجرا، از دستور attach به همراه شناسهی فرایند استفاده کنید:
python -m profiling.sampling attach 1234
برای تنظیمات سفارشی، بازهی نمونهبرداری (بر حسب مایکروثانیه) و مدتزمان (بر حسب ثانیه) را مشخص کنید:
python -m profiling.sampling run -i 50 -d 30 script.py
برای پروفایلگیری یک اسکریپت از خط فرمان:
python -m profiling.tracing script.py
برای پروفایلگیری بخشی از کد به شکل برنامهنویسیشده:
import profiling.tracing profiling.tracing.run('my_function()')
این کد دادهشده را تحت پروفایلگیر اجرا میکند و خلاصهای شامل تعداد دقیق فراخوانیهای تابع و زمانبندی را چاپ میکند.
هر دو پروفایلگیر آمار در سطح تابع را جمعآوری میکنند، البته آنها را در قالبهای متفاوتی نمایش میدهند. پروفایلگیر نمونهبرداری تجسمهای متعددی (نمودارهای شعلهای، نقشههای حرارتی، پروفایلگیر فایرفاکس، جدولهای pstats) را ارائه میدهد، در حالی که پروفایلگیر قطعی (deterministic) خروجی سازگار با pstats تولید میکند. صرفنظر از قالب، مفاهیم زیربنایی یکسان هستند.
مفاهیم کلیدی پروفایلگیری:
زمانی که صرف اجرای کد در خودِ تابع میشود، به استثنای زمانی که در توابع فراخوانیشده توسط آن صرف شده است. زمان مستقیم بالا نشان میدهد که تابع شامل عملیات پرهزینهای است.
زمانی که در تابع و تمام توابع فراخوانیشده توسط آن صرف شده است. این معیار هزینه کل فراخوانی یک تابع، از جمله کل زیردرخت فراخوانی آن را اندازهگیری میکند.
تعداد دفعاتی که تابع فراخوانی (قطعی) یا نمونهبرداری (آماری) شده است. در پروفایلگیری قطعی، این مقدار دقیق است. در پروفایلگیری آماری، نشاندهندهی تعداد دفعاتی است که تابع در یک نمونهی پشته ظاهر شده است.
فراخوانیهایی که توسط بازگشت (recursion) القا نشدهاند. هنگامی که یک تابع به صورت بازگشتی اجرا میشود، تعداد کل فراخوانی شامل فراخوانیهای بازگشتی است، اما فراخوانیهای اولیه فقط ورود اولیه را میشمارد. به صورت total/primitive نمایش داده میشود (برای مثال، 3/1 به معنای سه فراخوانی کل و یک فراخوانی اولیه است).
اینکه چه توابعی یک تابع مشخص را فراخوانی کردهاند (فراخوانندهها) و آن تابع چه توابعی را فراخوانی کرده است (فراخوانیشوندگان). نمودارهای شعلهای این را به صورت مستطیلهای تودرتو تجسم میکنند؛ pstats میتواند آن را از طریق متدهای print_callers() و print_callees() نمایش دهد.
برای سازگاری عقبگرد، ماژول cProfile به عنوان یک نام مستعار برای profiling.tracing در دسترس باقی میماند. کدهای موجودی که از import cProfile استفاده میکنند، بدون هیچ تغییری در تمام نسخههای آیندهی پایتون به کار خود ادامه خواهند داد.
منسوخ شده از نسخهی 3.15: ماژول خالص پایتون profile منسوخ شده است و در پایتون ۳.۱۷ حذف خواهد شد. بهجای آن از profiling.tracing (یا نام مستعار آن cProfile) استفاده کنید. برای راهنمایی مهاجرت به profile مراجعه کنید.
همچنین ببینید
profiling.samplingپروفایلگیر نمونهبرداری آماری با نمودارهای شعلهای، نقشههای حرارتی و تحلیل GIL. برای بیشتر کاربران توصیه میشود.
profiling.tracingپروفایلگیر ردیابی قطعی برای تعداد دقیق فراخوانیها.
pstatsتحلیل آماری و قالببندی برای دادههای پروفایل.
timeitماژولی برای اندازهگیری زمان اجرای قطعهکدهای کوچک.
زیرماژولها