เอกสารประกอบ
Pyinstrument เป็นตัวสร้างโปรไฟล์ Python เครื่องมือสร้างโปรไฟล์เป็นเครื่องมือที่ช่วยคุณเพิ่มประสิทธิภาพโค้ดของคุณ - ทำให้เร็วขึ้น หากต้องการเพิ่มความเร็วสูงสุด คุณควรเน้นไปที่ส่วนที่ช้าที่สุดของโปรแกรม Pyinstrument ช่วยคุณค้นหามัน!
☕️ไม่แน่ใจว่าจะเริ่มจากตรงไหนใช่ไหม? ลองชมวิดีโอบทช่วยสอนนี้จาก Calmcode.io!
pip install pyinstrument
Pyinstrument รองรับ Python 3.8+
หากต้องการเรียกใช้ Pyinstrument จากการชำระเงิน git มีขั้นตอนการสร้าง ดูที่การสนับสนุนสำหรับข้อมูลเพิ่มเติม
หากต้องการเรียนรู้วิธีใช้ pyinstrument หรือตรวจสอบข้อมูลอ้างอิง โปรดไปที่เอกสารประกอบ
pyinstrument script.py
โดยที่ script.py
มีคลาสที่ซีเรียลไลซ์ด้วย pickle
คุณอาจพบข้อผิดพลาดเนื่องจากกลไกการทำให้ซีเรียลไลซ์ไม่รู้ว่า __main__
อยู่ที่ไหน ดูปัญหานี้สำหรับวิธีแก้ปัญหา 11 ตุลาคม 2024
การปรับปรุงมากมายสำหรับตัวเรนเดอร์ HTML!
โหมดไทม์ไลน์ - ดูและซูมเข้าไปในไทม์ไลน์เชิงเส้นเชิงโต้ตอบ!
ขณะนี้โหมด HTML มีตัวเลือกแบบโต้ตอบ แทนที่จะต้องตั้งค่าล่วงหน้า
ปรับปรุงการออกแบบส่วนหัวของหน้า HTML
มุมมองสแต็กการโทร HTML รองรับการนำทางด้วยปุ่มลูกศร
วิธีการตรวจพบรหัส 'ไลบรารี' มีการเปลี่ยนแปลง ก่อนหน้านี้ หากสตริง '/lib/' เกิดขึ้นในเส้นทางของไฟล์ นั่นจะถือเป็นรหัสไลบรารี (และยุบตามค่าเริ่มต้น) ตอนนี้ pyinstrument จับเส้นทางของการติดตั้ง Python และ virtualenv/conda env ที่ใช้งานอยู่ ณ เวลาโปรไฟล์ ไฟล์ที่เก็บไว้ที่นั่นถือเป็นไลบรารี นั่นน่าจะให้ผลบวกลวงน้อยลง
การเรียกไปยังprofiler.start() สามารถส่งผ่านพารามิเตอร์ target_description ได้แล้ว ซึ่งจะแสดงอยู่ในการอ่านโปรไฟล์
ตรวจสอบโพสต์บล็อกของฉันสำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติใหม่
6 กันยายน 2024
glom
บน Python 3.12 หรือใหม่กว่า ซึ่งเปลี่ยนคำสั่ง locals() (#336)UnicodeDecodeError
ในบางแพลตฟอร์ม (#330)5 สิงหาคม 2024
2 สิงหาคม 2024
1 สิงหาคม 2024
with
block หรือเครื่องมือตกแต่งฟังก์ชัน/เมธอดได้แล้ว การดำเนินการนี้จะสร้างโปรไฟล์โค้ดและพิมพ์การอ่านข้อมูลสั้นๆ ลงในเทอร์มินัล (#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 มิถุนายน 2566
-p flat
บนบรรทัดคำสั่ง โหมดนี้จะแสดงเฟรมที่หนักที่สุดโดยวัดตามเวลาของตัวเอง ซึ่งอาจมีประโยชน์ในบางโค้ดเบส (#240)pstats
นี่คือรูปแบบไฟล์ที่ใช้โดย cprofile ใน stdlib มีรายละเอียดน้อยกว่าโปรไฟล์ pyinstrument แต่เข้ากันได้กับเครื่องมือมากกว่า (#236)--show-all
- pyinstrument จะไม่ลบเฟรมภายในของ Python อีกต่อไปเมื่อมีการระบุตัวเลือกนี้ (#239)5 พฤศจิกายน 2565
__traceback_hide__
จะถูกลบออกจากเอาต์พุต (#217)--async_mode=enabled
flag (#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
เพิ่มการรองรับ Python 3.11
%load_ext pyinstrument
ที่ด้านบนของสมุดบันทึกของคุณ จากนั้น %%pyinstrument
ในเซลล์ที่คุณต้องการสร้างโปรไฟล์pyinstrument -r speedscope
และอัปโหลดไปยังเว็บแอป speedscopePYINSTRUMENT_PROFILE_DIR_RENDERER
รองรับอะซิงก์! ขณะนี้ Pyinstrument ตรวจพบเมื่องาน async เข้าสู่การรอคอย และติดตามเวลาที่ใช้นอกบริบท async ภายใต้การรอคอยนี้
ตัวอย่างเช่น นี่คือสคริปต์ง่ายๆ ที่มีงาน async ที่จะเข้าสู่โหมดสลีป:
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, <built-in>
1.005 kqueue.control <built-in>: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]
สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบการทำโปรไฟล์ async และคุณสมบัติ Profiler.async_mode
Pyinstrument มีไซต์เอกสารประกอบ รวมถึงเอกสาร Python API ฉบับเต็ม!
--show
, --show-regex
, --show-all
ถูกละเว้นในบรรทัดคำสั่งtimeline
(บูลีน) ให้กับวิธี Profiler 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
บนบรรทัดคำสั่ง
เฟรม 'รายการ' ของกลุ่มที่ซ่อนอยู่จะแสดงขึ้น เพื่อให้คุณทราบว่าสายใดคือปัญหา
เฟรมที่ช้ามากในกลุ่มก็จะแสดงเช่นกัน เช่น การเรียก 'อ่าน' บนซ็อกเก็ต
รหัสแอปพลิเคชันจะถูกเน้นในคอนโซล
ตัวชี้วัดเพิ่มเติมจะแสดงที่ด้านบนของการติดตาม - การประทับเวลา จำนวนตัวอย่าง ระยะเวลา เวลา CPU
รหัสที่ซ่อนจะถูกควบคุมโดยตัวเลือก --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 จะเขียนเอาต์พุตคอนโซลไปยังไฟล์ temp และเปิดสิ่งนั้นในเบราว์เซอร์
-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 ซึ่งหมายความว่าจะไม่มีการจำกัดเธรดหลักอีกต่อไป ไม่มีข้อผิดพลาด IO อีกต่อไปเมื่อใช้ Pyinstrument และไม่จำเป็นต้องมีโหมด 'setprofile' แยกต่างหากอีกต่อไป!
เรนเดอร์ ผู้ใช้สามารถปรับแต่ง Pyinstrument เพื่อใช้ตัวเรนเดอร์สำรองด้วยอาร์กิวเมนต์ renderer
บน Profiler.output()
หรือใช้อาร์กิวเมนต์ --renderer
บนบรรทัดคำสั่ง
เครื่องบันทึก เพื่อรองรับกรณีการใช้งานอื่นๆ ของ Pyinstrument (เช่น แผนภูมิเปลวไฟ) ขณะนี้ pyinstrument มีโหมดบันทึก 'ไทม์ไลน์' โหมดนี้จะบันทึกเฟรมที่จับภาพในลักษณะเชิงเส้น ดังนั้นจึงสามารถดูการทำงานของโปรแกรมบนไทม์ไลน์ได้
pyinstrument
ตอนนี้คุณสามารถสร้างโปรไฟล์สคริปต์หลามจากเชลล์ได้โดยการรัน $ pyinstrument script.py
ตอนนี้เทียบเท่ากับ python -m pyinstrument
ขอบคุณ @asmeurer!รหัสแอปพลิเคชันจะถูกเน้นในการติดตาม HTML เพื่อให้มองเห็นได้ง่ายขึ้น
เพิ่มตัวเลือก PYINSTRUMENT_PROFILE_DIR
ให้กับอินเทอร์เฟซ Django ซึ่งจะบันทึกโปรไฟล์ของคำขอทั้งหมดไปยังไฟล์ในโฟลเดอร์ที่ระบุ มีประโยชน์สำหรับการเรียก API ของโปรไฟล์
เพิ่มตัวเลือก PYINSTRUMENT_USE_SIGNAL
ให้กับอินเทอร์เฟซ Django เพื่อใช้เมื่อโหมดสัญญาณแสดงปัญหา
ในการตั้งค่าสภาพแวดล้อม dev:
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
หากต้องการเรียกใช้การตรวจสอบ Linting ในเครื่อง:
pre-commit run --all-files
การตรวจสอบก่อนคอมมิตบางอย่าง เช่น isort
หรือ black
จะแก้ไขปัญหาที่พบโดยอัตโนมัติ ดังนั้นหากคำสั่งข้างต้นส่งกลับข้อผิดพลาด ให้ลองรันอีกครั้ง มันอาจจะสำเร็จในครั้งที่สอง :)
การดำเนินการตรวจสอบทั้งหมดอาจทำได้ช้า ดังนั้นคุณจึงสามารถดำเนินการตรวจสอบทีละรายการได้ เช่น เพื่อจัดรูปแบบซอร์สโค้ดที่ไม่ผ่านการตรวจสอบ isort
หรือ black
check:
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]