เอกสาร
Pyinstrument เป็น Python Profiler Profiler เป็นเครื่องมือที่จะช่วยให้คุณเพิ่มประสิทธิภาพรหัสของคุณ - ทำให้เร็วขึ้น เพื่อให้ได้ความเร็วที่เพิ่มขึ้นมากที่สุดคุณควรมุ่งเน้นไปที่ส่วนที่ช้าที่สุดของโปรแกรมของคุณ Pyinstrument ช่วยให้คุณค้นหาได้!
☕ไม่แน่ใจว่าจะเริ่มต้นตรงไหน? ลองดูวิดีโอนี้จาก calmCode.io!
pip install pyinstrument
Pyinstrument รองรับ Python 3.8+
ในการเรียกใช้ pyinstrument จากการชำระเงิน GIT มีขั้นตอนการสร้าง ลองดูข้อมูลเพิ่มเติม
หากต้องการเรียนรู้วิธีใช้ Pyinstrument หรือตรวจสอบการอ้างอิงมุ่งหน้าไปยังเอกสาร
pyinstrument script.py
โดยที่ script.py
มีคลาสที่เป็นอนุกรมด้วย pickle
คุณอาจพบข้อผิดพลาดเนื่องจากเครื่องจักรการทำให้เป็นอนุกรมไม่ทราบว่า __main__
อยู่ที่ไหน ดูปัญหานี้สำหรับการแก้ปัญหา 11 ตุลาคม 2567
โหลดการปรับปรุงให้กับ HTML Renderer!
โหมดไทม์ไลน์ - ดูและซูมเข้าไปในไทม์ไลน์เชิงเส้นแบบโต้ตอบ!
โหมด HTML ตอนนี้มีตัวเลือกแบบโต้ตอบแทนที่จะต้องการตั้งค่าล่วงหน้า
ปรับปรุงการออกแบบส่วนหัวของหน้า HTML
มุมมองสแต็กการโทร HTML รองรับการนำทางลูกศรคีย์
วิธีการตรวจพบรหัส 'ไลบรารี' มีการเปลี่ยนแปลง ก่อนหน้านี้หากสตริง '/lib/' เกิดขึ้นในเส้นทางไฟล์นั่นถือว่าเป็นรหัสไลบรารี (และยุบตามค่าเริ่มต้น) ตอนนี้ Pyinstrument จับเส้นทางของการติดตั้ง Python และ Virtualenv/Conda env ที่ใช้งานอยู่ในเวลาโปรไฟล์ ไฟล์ที่เก็บไว้นั้นถือว่าเป็นไลบรารี นั่นควรให้ผลบวกที่ผิดพลาดน้อยลง
การโทรไปที่ profiler.start () สามารถผ่านพารามิเตอร์ target_description ซึ่งจะแสดงในการอ่านค่าโปรไฟล์
ตรวจสอบโพสต์บล็อกของฉันสำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติใหม่
6 กันยายน 2567
glom
บน Python 3.12 หรือใหม่กว่าซึ่งกลายพันธุ์ในท้องถิ่น () dict (#336)UnicodeDecodeError
ในบางแพลตฟอร์ม (#330)5 สิงหาคม 2567
2 สิงหาคม 2567
1 สิงหาคม 2567
with
บล็อกหรือนักตกแต่งฟังก์ชั่น/วิธีการ สิ่งนี้จะโปรไฟล์รหัสและพิมพ์การอ่านค่าสั้น ๆ ลงในเทอร์มินัล (#327)flat
ให้กับเอาต์พุตคอนโซลเพื่อนำเสนอรายการฟังก์ชั่นแบน (#294)26 มกราคม 2567
show_all
ให้กับ profiler.output_html8 พฤศจิกายน 2566
%pyinstrument
(#278)12 ตุลาคม 2566
-c
ซึ่งอนุญาตให้ใช้รหัสการทำโปรไฟล์โดยตรงจากบรรทัดคำสั่งเช่น python -c
(#271)Profiler.write_html
สำหรับการเขียนเอาต์พุต HTML ไปยังไฟล์โดยตรง (#266)7 กันยายน 2566
1 กันยายน 2566
22 กรกฎาคม 2023
[X frames hidden]
ในเอาต์พุตเมื่อเฟรมถูกลบเนื่องจาก __tracebackhide__
(#255)None
ในเอาต์พุตคอนโซล (#254)5 มิถุนายน 2566
-p flat
บนบรรทัดคำสั่ง โหมดนี้แสดงเฟรมที่หนักที่สุดที่วัดได้ด้วยตัวเองซึ่งอาจเป็นประโยชน์ในบางกรณี (#240)pstats
นี่คือรูปแบบไฟล์ที่ใช้โดย cprofile ใน stdlib มีรายละเอียดน้อยกว่าโปรไฟล์ Pyinstrument แต่เข้ากันได้กับเครื่องมือเพิ่มเติม (#236)--show-all
-PyInstrument จะไม่ลบเฟรม Python-internal อีกต่อไปเมื่อมีการจัดหาตัวเลือกนี้ (#239)5 พฤศจิกายน 2565
__traceback_hide__
จะถูกลบออกจากเอาต์พุต (#217)--async_mode=enabled
FLAG (#212)21 สิงหาคม 2565
--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 renderer โดยอัตโนมัติ หรือถ้าคุณทำ pyinstrument -o profile.pyisession myscript.py
มันจะบันทึกวัตถุเซสชันดิบ
เพิ่มตัวอย่างการใช้งานสำหรับ fastapi และ pytest ในเอกสาร
แก้ไขข้อผิดพลาดที่ทำให้เกิด indimplementedError เมื่อใช้ async_mode=strict
เพิ่มการสนับสนุนสำหรับ Python 3.11
%load_ext pyinstrument
ที่ด้านบนของสมุดบันทึกของคุณจากนั้น %%pyinstrument
ในเซลล์ที่คุณต้องการโปรไฟล์pyinstrument -r speedscope
และอัปโหลดไปยังแอพ Speedscope WebPYINSTRUMENT_PROFILE_DIR_RENDERER
สนับสนุน Async! ตอนนี้ 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,
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]
สำหรับข้อมูลเพิ่มเติมตรวจสอบเอกสารการทำโปรไฟล์ Async และคุณสมบัติ 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
บนบรรทัดคำสั่ง
เฟรม 'รายการ' ของกลุ่มที่ซ่อนอยู่จะปรากฏขึ้นเพื่อให้คุณรู้ว่าการโทรใดคือปัญหา
เฟรมที่ช้ามากในกลุ่มก็แสดงเช่นกันเช่นการโทร 'อ่าน' บนซ็อกเก็ต
รหัสแอปพลิเคชันถูกเน้นในคอนโซล
ตัวชี้วัดเพิ่มเติมจะแสดงที่ด้านบนของการติดตาม - การประทับเวลาจำนวนตัวอย่างระยะเวลาเวลา 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 Renderer ได้รับการเขียนใหม่เป็นแอพ Vue.js การปรับปรุงคอนโซลทั้งหมดใช้กับเอาต์พุต HTML ด้วยเช่นกันรวมถึงการโต้ตอบ
(ภายใน) เพิ่มการทดสอบหน่วยและการรวมเข้าด้วยกันจำนวนมาก!
อ๋อ ดู #49 สำหรับรายละเอียดที่เต็มไปด้วยเลือด ฉันหวังว่าคุณจะชอบมัน
Recorders
ถูกลบออก ขณะนี้การบันทึกเฟรมอยู่ภายในวัตถุ Profiler
ซึ่งหมายความว่าวัตถุ 'เฟรม' มีวัตถุประสงค์ทั่วไปมากกว่าซึ่งปูทางไป ...--version
ตัวเลือกบรรทัดคำสั่ง Version เพิ่มการสนับสนุนสำหรับเอาต์พุต JSON ใช้ pyinstrument --renderer=json scriptfile.py
PR
@IDDAN ได้รวบรวมผู้ชมเชิงโต้ตอบโดยใช้เอาต์พุต JSON!
เมื่อเรียกใช้ pyinstrument --html
และคุณไม่ได้ส่งเอาต์พุตไปยังไฟล์ Pyinstrument จะเขียนเอาต์พุตคอนโซลไปยังไฟล์ TEMP และเปิดในเบราว์เซอร์
-m
เช่น pyinstrument -m module_name
! PR ตอนนี้ 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
ตอนนี้คุณสามารถโปรไฟล์สคริปต์ Python จากเชลล์ได้โดยเรียกใช้ $ 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
เพื่อเรียกใช้การตรวจสอบผ้าสำลีในพื้นที่:
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 Renderer ทำงานโดยการฝังตัวอย่าง JSON ของตัวอย่างด้วย JavaScript 'Bundle' ภายในไฟล์ HTML ที่สามารถดูได้ในเว็บเบราว์เซอร์ใด ๆ
หากต้องการแก้ไขสไตล์ HTML Renderer ทำ:
cd html_renderer
npm ci
npm run serve
เมื่อเปิดตัวโดยไม่มี window.profileSession
ระดับบนสุด Profilesession วัตถุจะดึงโปรไฟล์ตัวอย่างเพื่อให้คุณสามารถทำงานกับมันได้
เพื่อรวบรวมแอป JS และรวมกลับเข้าไปในเครื่องมือ Pyinstrument Python:
bin/build_js_bundle.py [--force]