التوثيق
Pyinstrument هو ملف تعريف Python. يعد ملف التعريف أداة تساعدك على تحسين التعليمات البرمجية الخاصة بك - وجعلها أسرع. للحصول على أكبر زيادة في السرعة، يجب عليك التركيز على الجزء الأبطأ من برنامجك. Pyinstrument يساعدك في العثور عليه!
☕️ لست متأكدا من أين تبدأ؟ شاهد هذا الفيديو التعليمي من موقع Calmcode.io!
pip install pyinstrument
يدعم Pyinstrument إصدار Python 3.8+.
لتشغيل Pyinstrument من خلال git checkout، هناك خطوة إنشاء. ألق نظرة على المساهمة لمزيد من المعلومات.
لمعرفة كيفية استخدام pyinstrument، أو للتحقق من المرجع، توجه إلى الوثائق.
pyinstrument script.py
حيث يحتوي script.py
على فئة متسلسلة باستخدام pickle
، قد تواجه أخطاء لأن آلية التسلسل لا تعرف مكان __main__
. راجع هذه المشكلة للتعرف على الحلول 11 أكتوبر 2024
الكثير من التحسينات على عارض HTML!
وضع الجدول الزمني - شاهد وتكبير الجدول الزمني الخطي التفاعلي!
يحتوي وضع HTML الآن على خيارات تفاعلية، بدلاً من الحاجة إلى ضبط الإعداد مقدمًا.
تبسيط تصميم رأس صفحة HTML.
يدعم عرض مكدس مكالمات HTML التنقل باستخدام مفتاح السهم.
تم تغيير طريقة اكتشاف رمز "المكتبة". في السابق، إذا حدثت السلسلة "/lib/" في مسار الملف، كان ذلك يعتبر رمز مكتبة (ويُطوى افتراضيًا). الآن، يلتقط pyinstrument مسارات تثبيت Python وأي بيئة Virtualenv/conda نشطة في وقت الملف الشخصي. تعتبر الملفات المخزنة هناك مكتبة. وينبغي أن يعطي عددا أقل من النتائج الإيجابية الكاذبة.
يمكن الآن للاستدعاءات إلى Profiler.start() تمرير معلمة target_description، والتي يتم عرضها في قراءات ملف التعريف.
تحقق من منشور مدونتي للحصول على مزيد من المعلومات حول الميزات الجديدة.
6 سبتمبر 2024
glom
على Python 3.12 أو الإصدارات الأحدث، والتي تؤدي إلى تغيير الإملاء المحلي (). (#336)UnicodeDecodeError
في بعض الأنظمة الأساسية (#330)5 أغسطس 2024
2 أغسطس 2024
1 أغسطس 2024
with
كتلة أو أداة تزيين الوظيفة/الطريقة. سيؤدي هذا إلى تحديد الكود وطباعة قراءات قصيرة في الجهاز. (#327)flat
إلى مخرجات وحدة التحكم لتقديم قائمة ثابتة من الوظائف (#294)26 يناير 2024
show_all
إلى Profiler.output_html8 نوفمبر 2023
%pyinstrument
(#278)12 أكتوبر 2023
-c
، التي تسمح بإنشاء ملفات تعريفية مباشرة من سطر الأوامر، مثل python -c
. (#271)Profiler.write_html
لكتابة مخرجات HTML إلى ملف مباشرة. (#266)7 سبتمبر 2023
1 سبتمبر 2023
22 يوليو 2023
[X frames hidden]
في المخرجات عند حذف الإطارات بسبب __tracebackhide__
(#255)None
في مخرجات وحدة التحكم (#254)5 يونيو 2023
-p flat
في سطر الأوامر. يعرض هذا الوضع الإطار الأثقل مقاسًا بالوقت الذاتي، وهو ما يمكن أن يكون مفيدًا في بعض قواعد التعليمات البرمجية. (#240)pstats
. هذا هو تنسيق الملف الذي يستخدمه cprofile في ملف stdlib. إنها أقل تفصيلاً من ملفات تعريف pyinstrument، ولكنها متوافقة مع المزيد من الأدوات. (#236)--show-all
- لن يقوم pyinstrument بإزالة إطارات Python الداخلية بعد الآن عند توفير هذا الخيار. (#239)5 نوفمبر 2022
__traceback_hide__
من المخرجات (#217)--async_mode=enabled
. (#212)21 أغسطس 2022
--interval
(ثواني، الافتراضي 0.001) لتغيير الفاصل الزمني الذي تقوم pyinstrument باختباره لبرنامج ما. يعد هذا مفيدًا للبرامج طويلة التشغيل، حيث تؤدي زيادة الفاصل الزمني إلى تقليل حمل الذاكرة. يضيف خيار سطر الأوامر -p
--render-option
الذي يسمح بإعداد خيارات العرض بشكل عشوائي. يتيح لك هذا تعيين خيارات مثل filter_threshold
من سطر الأوامر، عن طريق القيام بشيء مثل pyinstrument -p processor_options.filter_threshold=0
.
إليك مخرجات المساعدة للخيار:
-p RENDER_OPTION, --render-option=RENDER_OPTION
options to pass to the renderer, in the format
'flag_name' or 'option_name=option_value'. For
example, to set the option 'time', pass '-p
time=percent_of_total'. To pass multiple options, use
the -p option multiple times. You can set processor
options using dot-syntax, like '-p
processor_options.filter_threshold=0'. option_value is
parsed as a JSON value or a string.
إضافة القدرة على عرض الأوقات في مخرجات وحدة التحكم كنسب مئوية، بدلاً من الأوقات المطلقة. استخدم خيار ConsoleRenderer time='percent_of_total'
، أو في سطر الأوامر، استخدم -p
، مثل pyinstrument -p time=percent_of_total
.
يضيف خيارات سطر الأوامر لتحميل وحفظ جلسات pyinstrument. يمكنك حفظ البيانات الأولية لجلسة pyinstrument باستخدام -r session
، مثل pyinstrument -r session -o session.pyisession myscript.py
. يتم التحميل عبر --load
، على سبيل المثال pyinstrument --load session.pyisession
.
يتم استنتاج تنسيق إخراج سطر الأوامر من امتداد ملف الإخراج -o
. لذا، إذا قمت بإجراء pyinstrument -o profile.html myscript.py
، فلن تحتاج إلى توفير -r html
، وسيستخدم pyinstrument عارض HTML تلقائيًا. أو إذا قمت بإجراء pyinstrument -o profile.pyisession myscript.py
، فسوف يحفظ كائن الجلسة الأولية.
يضيف أمثلة استخدام لـ FastAPI وpytest إلى الوثائق.
يعمل على إصلاح الخلل الذي يسبب NotImplementedError عند استخدام async_mode=strict
.
يضيف الدعم لبيثون 3.11
%load_ext pyinstrument
في الجزء العلوي من دفتر ملاحظاتك، ثم %%pyinstrument
في الخلية التي تريد إنشاء ملف تعريف لها.pyinstrument -r speedscope
، وقم بالتحميل إلى تطبيق الويب speedscope.PYINSTRUMENT_PROFILE_DIR_RENDERER
.دعم غير متزامن! يكتشف Pyinstrument الآن متى تصل مهمة غير متزامنة إلى حالة انتظار، ويتتبع الوقت الذي يقضيه خارج السياق غير المتزامن في هذا الانتظار.
لذلك، على سبيل المثال، إليك برنامج نصي بسيط يحتوي على مهمة غير متزامنة تؤدي إلى وضع السكون:
import asyncio
from pyinstrument import Profiler
async def main ():
p = Profiler ( async_mode = 'disabled' )
with p :
print ( 'Hello ...' )
await asyncio . sleep ( 1 )
print ( '... World!' )
p . print ()
asyncio . run ( main ())
قبل Pyinstrument 4.0.0، كنا نرى فقط الوقت المستغرق في حلقة التشغيل، مثل هذا:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:33:03 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.006 CPU time: 0.001
/ _/ v3.4.2
Program: examples/async_example_simple.py
1.006 _run_once asyncio/base_events.py:1784
└─ 1.005 select selectors.py:553
[3 frames hidden] selectors,
1.005 kqueue.control :0
الآن، مع pyinstrument 4.0.0، نحصل على:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:30:43 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.007 CPU time: 0.001
/ _/ v4.0.0
Program: examples/async_example_simple.py
1.006 main async_example_simple.py:4
└─ 1.005 sleep asyncio/tasks.py:641
[2 frames hidden] asyncio
1.005 [await]
لمزيد من المعلومات، راجع وثائق ملفات التعريف غير المتزامنة وخاصية Profiler.async_mode.
لدى Pyinstrument موقع توثيق، بما في ذلك مستندات Python API الكاملة!
--show
و --show-regex
و --show-all
في سطر الأوامر.timeline
(منطقي) إلى أساليب ملف التعريف output_html()
و open_in_browser()
.pyinstrument -m module
، حيث لم يتمكن pyinstrument من العثور على وحدات في الدليل الحالي.Python -> C -> Python
كـ Python -> Python
، ولكن سيتم نسب Python -> Python -> C
بشكل صحيح. (#103)<__array_function__ internals>
التي تظهر كرمز التطبيق في التقارير--show
و --show-regex
لتحديد ملفات معينة ليتم عرضها. يساعد هذا في إنشاء ملف تعريف داخل وحدات محددة، مع إخفاء وحدات أخرى. على سبيل المثال، pyinstrument --show '*/sympy/*' script.py
.سيقوم Pyinstrument الآن بإخفاء الآثار من خلال المكتبات التي تستخدمها افتراضيًا. لذلك بدلاً من إظهار الكثير من الإطارات التي تمر عبر الأجزاء الداخلية لشيء خارجي، على سبيل المثال urllib، فإنه يتيح لك التركيز على التعليمات البرمجية الخاصة بك.
قبل | بعد |
---|---|
للعودة إلى السلوك القديم، استخدم --show-all
في سطر الأوامر.
يتم عرض إطارات "الإدخال" للمجموعات المخفية، حتى تعرف أي مكالمة هي المشكلة
يتم عرض الإطارات البطيئة جدًا في المجموعات أيضًا، على سبيل المثال، استدعاء "القراءة" على المقبس
يتم تمييز رمز التطبيق في وحدة التحكم
يتم عرض مقاييس إضافية في الجزء العلوي من التتبع - الطابع الزمني، وعدد العينات، والمدة، ووقت وحدة المعالجة المركزية
يتم التحكم في التعليمات البرمجية المخفية من خلال خيارات --hide
أو --hide-regex
- التي تتطابق مع مسار ملفات التعليمات البرمجية.
--hide=EXPR glob-style pattern matching the file paths whose
frames to hide. Defaults to '*/lib/*'.
--hide-regex=REGEX regex matching the file paths whose frames to hide.
Useful if --hide doesn't give enough control.
يتم دعم إخراج المخطط الزمني من سطر الأوامر.
-t, --timeline render as a timeline - preserve ordering and don't
condense repeated calls
نظرًا لوجود عدد قليل من خيارات العرض الآن، يمكنك تحميل جلسة إنشاء ملفات تعريف سابقة باستخدام --load-prev
- pyinstrument الذي يحتفظ بآخر 10 جلسات.
يمكن للمجموعات المخفية أيضًا الاتصال مرة أخرى بكود التطبيق، الذي يبدو كما يلي:
(داخليًا) عند تسجيل المخططات الزمنية، أصبحت أشجار الإطارات خطية تمامًا الآن، مما يسمح بإنشاء مخططات إطارية فائقة الدقة.
(داخليًا) تمت إعادة كتابة عارض HTML كتطبيق Vue.js. تنطبق جميع تحسينات وحدة التحكم على مخرجات HTML أيضًا، بالإضافة إلى أنها تفاعلية.
(داخلي) تمت إضافة الكثير من اختبارات الوحدة والتكامل!
نعم! انظر رقم 49 للحصول على التفاصيل الدموية. أتمنى أن يعجبك
Recorders
. أصبح تسجيل الإطار الآن داخليًا لكائن Profiler
. وهذا يعني أن كائنات "الإطار" ذات أغراض عامة أكثر، مما يمهد الطريق لـ...--version
تمت إضافة دعم لإخراج JSON. استخدم pyinstrument --renderer=json scriptfile.py
. العلاقات العامة
قام @iddan بتجميع عارض تفاعلي باستخدام مخرجات JSON!
عند تشغيل pyinstrument --html
ولم تقم بتوجيه الإخراج إلى ملف، سيقوم pyinstrument بكتابة مخرجات وحدة التحكم إلى ملف مؤقت وفتحه في المتصفح.
-m
، على سبيل المثال pyinstrument -m module_name
! العلاقات العامة يمكن الآن استخدام Pyinstrument في with
.
على سبيل المثال:
profiler = pyinstrument.Profiler()
with profiler:
# do some work here...
print(profiler.output_text())
إصلاح البرامج الوسيطة للإصدارات الأقدم من Django
يستخدم Pyinstrument وضع التنميط الجديد . بدلاً من استخدام الإشارات، يستخدم pyintrument ملف تعريف إحصائيًا جديدًا مبنيًا على PyEval_SetProfile. وهذا يعني عدم وجود قيود على الموضوع الرئيسي، ولا مزيد من أخطاء الإدخال والإخراج عند استخدام Pyinstrument، ولا حاجة إلى وضع "setprofile" منفصل!
العارضين . يمكن للمستخدمين تخصيص Pyinstrument لاستخدام عارضين بديلين مع وسيطة renderer
في Profiler.output()
أو باستخدام وسيطة --renderer
في سطر الأوامر.
مسجلات . لدعم حالات الاستخدام الأخرى لـ Pyinstrument (على سبيل المثال، مخططات اللهب)، أصبح لدى pyinstrument الآن وضع مسجل "الخط الزمني". يسجل هذا الوضع الإطارات الملتقطة بطريقة خطية، بحيث يمكن عرض تنفيذ البرنامج على جدول زمني.
pyinstrument
. يمكنك الآن إنشاء ملف تعريف للنصوص البرمجية لـ python من الصدفة عن طريق تشغيل $ pyinstrument script.py
. وهذا يعادل الآن python -m pyinstrument
. شكرا @asmeurer!يتم تمييز رمز التطبيق في آثار HTML لتسهيل اكتشافه
تمت إضافة خيار PYINSTRUMENT_PROFILE_DIR
إلى واجهة Django، والذي سيقوم بتسجيل الملفات الشخصية لجميع الطلبات إلى ملف المجلد المحدد. مفيد في تحديد ملامح مكالمات API.
تمت إضافة خيار PYINSTRUMENT_USE_SIGNAL
إلى واجهة Django، للاستخدام عندما يمثل وضع الإشارة مشكلات.
لإعداد بيئة التطوير:
virtualenv --python=python3 env
. env/bin/activate
pip install --upgrade pip
pip install -r requirements-dev.txt
pre-commit install --install-hooks
للحصول على بعض مخرجات العينة:
pyinstrument examples/wikipedia_article_word_count.py
لتشغيل الاختبارات:
pytest
لتشغيل عمليات فحص الفحص محليًا:
pre-commit run --all-files
ستعمل بعض عمليات التحقق المسبقة، مثل isort
أو black
، على إصلاح المشكلات التي تجدها تلقائيًا. لذلك إذا أظهر الأمر أعلاه خطأ، حاول تشغيله مرة أخرى، فقد ينجح في المرة الثانية :)
يمكن أن يكون تشغيل جميع عمليات التحقق بطيئًا، لذا يمكنك أيضًا تشغيل عمليات التحقق بشكل فردي، على سبيل المثال، لتنسيق التعليمات البرمجية المصدر التي تفشل isort
أو عمليات التحقق black
:
pre-commit run --all-files isort
pre-commit run --all-files black
لتشخيص سبب فشل عمليات التحقق pyright
:
pre-commit run --all-files pyright
يعمل عارض HTML عن طريق تضمين تمثيل JSON للعينة مع "حزمة" Javascript داخل ملف HTML يمكن عرضه في أي متصفح ويب.
لتحرير نمط عارض HTML، قم بما يلي:
cd html_renderer
npm ci
npm run serve
عند التشغيل بدون كائن window.profileSession
ذي المستوى الأعلى، فإنه سيجلب نموذج ملف تعريف حتى تتمكن من العمل معه.
لتجميع تطبيق JS وتجميعه مرة أخرى في أداة pyinstrument python:
bin/build_js_bundle.py [--force]