ภาพโดยผู้เขียน
ในฐานะนักพัฒนาซอฟต์แวร์ คุณคงเคยได้ยินคำพูดนี้มาก่อน “การปรับให้เหมาะสมก่อนเวลาอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด”—มากกว่าหนึ่งครั้ง—ในอาชีพการงานของคุณ แม้ว่าการปรับให้เหมาะสมอาจไม่มีประโยชน์มากนัก (หรือจำเป็นจริงๆ) สำหรับโปรเจ็กต์ขนาดเล็ก แต่การทำโปรไฟล์ก็มักจะมีประโยชน์
หลังจากที่คุณเขียนโค้ดโมดูลเสร็จแล้ว แนวทางปฏิบัติที่ดีในการกำหนดโปรไฟล์โค้ดของคุณเพื่อวัดว่าแต่ละส่วนใช้เวลาดำเนินการนานเท่าใด ซึ่งสามารถช่วยระบุกลิ่นโค้ดและแนะนำการปรับให้เหมาะสมเพื่อปรับปรุงคุณภาพโค้ดได้ ดังนั้นควรกำหนดโปรไฟล์โค้ดของคุณก่อนที่จะเพิ่มประสิทธิภาพ!
ในการดำเนินการขั้นตอนแรก คู่มือนี้จะช่วยให้คุณเริ่มต้นสร้างโปรไฟล์ใน Python โดยใช้เครื่องมือในตัว หมดเวลา และ ซีโปรไฟล์ โมดูล คุณจะได้เรียนรู้การใช้ทั้งอินเทอร์เฟซบรรทัดคำสั่งและสิ่งที่เรียกได้เทียบเท่าภายในสคริปต์ Python
โมดูล timeit เป็นส่วนหนึ่งของไลบรารีมาตรฐานของ Python และมีฟังก์ชันอำนวยความสะดวกบางอย่างที่สามารถใช้เพื่อกำหนดเวลาตัวอย่างโค้ดสั้น ๆ ได้
มาดูตัวอย่างง่ายๆ ของการกลับรายการ Python เราจะวัดเวลาดำเนินการในการรับสำเนารายการแบบย้อนกลับโดยใช้:
-
reversed()
ฟังก์ชันและ - การแบ่งส่วนรายการ
>>> nums=[6,9,2,3,7]
>>> list(reversed(nums))
[7, 3, 2, 9, 6]
>>> nums[::-1]
[7, 3, 2, 9, 6]
วิ่ง timeit ที่ Command Line
คุณสามารถเรียกใช้ timeit
ที่บรรทัดคำสั่งโดยใช้ไวยากรณ์:
$ python -m timeit -s 'setup-code' -n 'number' -r 'repeat' 'stmt'
คุณจะต้องจัดเตรียมใบแจ้งยอด stmt
ซึ่งจะต้องวัดเวลาดำเนินการ
คุณสามารถระบุ setup
รหัสเมื่อจำเป็น - ใช้ตัวเลือกสั้น -s หรือตัวเลือกยาว - ตั้งค่า รหัสการตั้งค่าจะทำงานเพียงครั้งเดียว
พื้นที่ number
จำนวนครั้งในการรันคำสั่ง: ตัวเลือกแบบสั้น -n หรือตัวเลือกแบบยาว –หมายเลข เป็นทางเลือก และจำนวนครั้งในการทำซ้ำรอบนี้: short option -r หรือ long option –repeat ก็เป็นทางเลือกเช่นกัน
เรามาดูการดำเนินการข้างต้นสำหรับตัวอย่างของเรา:
ที่นี่การสร้างรายการคือ setup
รหัสและการย้อนกลับรายการคือคำสั่งที่ต้องกำหนดเวลา:
$ python -m timeit -s 'nums=[6,9,2,3,7]' 'list(reversed(nums))'
500000 loops, best of 5: 695 nsec per loop
เมื่อคุณไม่ได้ระบุค่าสำหรับ repeat
จะใช้ค่าเริ่มต้นที่ 5 และเมื่อคุณไม่ระบุ number
โค้ดจะถูกรันหลาย ๆ ครั้งตามต้องการเพื่อให้ถึงเวลาทั้งหมด อย่างน้อย 0.2 วินาที.
ตัวอย่างนี้กำหนดจำนวนครั้งในการดำเนินการคำสั่งอย่างชัดเจน:
$ python -m timeit -s 'nums=[6,9,2,3,7]' -n 100Bu000 'list(reversed(nums))'
100000 loops, best of 5: 540 nsec per loop
ค่าเริ่มต้นของ repeat
คือ 5 แต่เราสามารถตั้งค่าให้เป็นค่าที่เหมาะสมได้:
$ python3 -m timeit -s 'nums=[6,9,2,3,7]' -r 3 'list(reversed(nums))'
500000 loops, best of 3: 663 nsec per loop
เรามากำหนดเวลาวิธีการแบ่งส่วนรายการด้วย:
$ python3 -m timeit -s 'nums=[6,9,2,3,7]' 'nums[::-1]'
1000000 loops, best of 5: 142 nsec per loop
ดูเหมือนว่าวิธีการแบ่งส่วนรายการจะเร็วขึ้น (ตัวอย่างทั้งหมดอยู่ใน Python 3.10 บน Ubuntu 22.04)
รัน timeit ในสคริปต์ Python
นี่เทียบเท่ากับเวลาทำงานภายในสคริปต์ Python:
import timeit setup = 'nums=[9,2,3,7,6]'
number = 100000
stmt1 = 'list(reversed(nums))'
stmt2 = 'nums[::-1]' t1 = timeit.timeit(setup=setup,stmt=stmt1,number=number)
t2 = timeit.timeit(setup=setup,stmt=stmt2,number=number) print(f"Using reversed() fn.: {t1}")
print(f"Using list slicing: {t2}")
พื้นที่ timeit()
callable ส่งคืนเวลาดำเนินการของ stmt
for
number
ครั้ง โปรดสังเกตว่าเราสามารถระบุจำนวนครั้งในการรันหรือสร้างได้อย่างชัดเจน number
ใช้ค่าเริ่มต้นที่ 1000000
Output >>
Using reversed() fn.: 0.08982690000000002
Using list slicing: 0.015550800000000004
ซึ่งจะรันคำสั่งโดยไม่ต้องทำซ้ำฟังก์ชันจับเวลาตามที่ระบุ number
ของครั้งและส่งคืนเวลาดำเนินการ นอกจากนี้ยังค่อนข้างใช้กันทั่วไป time.repeat()
และใช้เวลาขั้นต่ำดังภาพ:
import timeit setup = 'nums=[9,2,3,7,6]'
number = 100000
stmt1 = 'list(reversed(nums))'
stmt2 = 'nums[::-1]' t1 = min(timeit.repeat(setup=setup,stmt=stmt1,number=number))
t2 = min(timeit.repeat(setup=setup,stmt=stmt2,number=number)) print(f"Using reversed() fn.: {t1}")
print(f"Using list slicing: {t2}")
นี่จะเป็นการทำซ้ำขั้นตอนการเรียกใช้โค้ด number
ครั้ง repeat
จำนวนครั้งและส่งคืนเวลาดำเนินการขั้นต่ำ ที่นี่เรามีการทำซ้ำ 5 ครั้ง แต่ละครั้งมี 100000 ครั้ง
Output >>
Using reversed() fn.: 0.055375300000000016
Using list slicing: 0.015101400000000043
เราได้เห็นแล้วว่า timeit สามารถใช้วัดเวลาดำเนินการของโค้ดขนาดสั้นได้อย่างไร อย่างไรก็ตาม ในทางปฏิบัติ การทำโปรไฟล์สคริปต์ Python ทั้งหมดจะมีประโยชน์มากกว่า
นี่จะทำให้เราทราบเวลาดำเนินการของฟังก์ชันและการเรียกใช้เมธอดทั้งหมด รวมถึงฟังก์ชันและวิธีการในตัวด้วย ดังนั้นเราจึงได้แนวคิดที่ดีขึ้นเกี่ยวกับการเรียกใช้ฟังก์ชันที่มีราคาแพงกว่าและระบุโอกาสในการปรับให้เหมาะสมที่สุด ตัวอย่างเช่น อาจมีการเรียก API ที่ช้าเกินไป หรือฟังก์ชันอาจมีการวนซ้ำที่สามารถแทนที่ได้ด้วยนิพจน์ความเข้าใจแบบ Pythonic มากขึ้น
มาเรียนรู้วิธีสร้างโปรไฟล์สคริปต์ Python โดยใช้โมดูล cProfile (ซึ่งเป็นส่วนหนึ่งของไลบรารีมาตรฐาน Python ด้วย)
พิจารณาสคริปต์ Python ต่อไปนี้:
# main.py
import time def func(num): for i in range(num): print(i) def another_func(num): time.sleep(num) print(f"Slept for {num} seconds") def useful_func(nums, target): if target in nums: return nums.index(target) if __name__ == "__main__": func(1000) another_func(20) useful_func([2, 8, 12, 4], 12)
ที่นี่เรามีสามฟังก์ชั่น:
func()
ที่วนซ้ำช่วงตัวเลขแล้วพิมพ์ออกมาanother func()
ที่มีการเรียกไปยังsleep()
ฟังก์ชันuseful_func()
ที่ส่งคืนดัชนีของหมายเลขเป้าหมายในรายการ (หากมีเป้าหมายอยู่ในรายการ)
ฟังก์ชันที่ระบุไว้ข้างต้นจะถูกเรียกใช้ทุกครั้งที่คุณเรียกใช้สคริปต์ main.py
เรียกใช้ cProfile ที่ Command Line
เรียกใช้ cProfile ที่บรรทัดคำสั่งโดยใช้:
python3 -m file-name.py
ที่นี่เราได้ตั้งชื่อไฟล์ main.py:
python3 -m main.py
การรันสิ่งนี้ควรให้ผลลัพธ์ต่อไปนี้:
Output >> 0 ... 999 Slept for 20 seconds
และโปรไฟล์ดังต่อไปนี้:
ที่นี่ ncalls
หมายถึงจำนวนการเรียกใช้ฟังก์ชันและ percall
หมายถึงเวลาต่อการเรียกใช้ฟังก์ชัน ถ้ามูลค่าของ ncalls
มีค่ามากกว่าหนึ่งแล้ว percall
คือเวลาเฉลี่ยของการโทรทั้งหมด
เวลาดำเนินการของสคริปต์ถูกครอบงำโดย another_func
ที่ใช้บิวท์อิน sleep
การเรียกใช้ฟังก์ชัน (พักเป็นเวลา 20 วินาที) เราเห็นสิ่งนั้น print
การเรียกใช้ฟังก์ชันก็ค่อนข้างแพงเช่นกัน
การใช้ cProfile ในสคริปต์ Python
ในขณะที่เรียกใช้ cProfile ที่บรรทัดคำสั่งทำงานได้ดี คุณยังสามารถเพิ่มฟังก์ชันการทำโปรไฟล์ให้กับสคริปต์ Python ได้ คุณสามารถใช้ cProfile ควบคู่กับ โมดูล pstats สำหรับการจัดทำโปรไฟล์และการเข้าถึงสถิติ
ตามแนวทางปฏิบัติที่ดีที่สุดในการจัดการการตั้งค่าทรัพยากรและการรื้อถอนให้ดีขึ้น ให้ใช้คำสั่ง with และสร้างออบเจ็กต์โปรไฟล์ที่ใช้เป็นตัวจัดการบริบท:
# main.py
import pstats
import time
import cProfile def func(num): for i in range(num): print(i) def another_func(num): time.sleep(num) print(f"Slept for {num} seconds") def useful_func(nums, target): if target in nums: return nums.index(target) if __name__ == "__main__": with cProfile.Profile() as profile: func(1000) another_func(20) useful_func([2, 8, 12, 4], 12) profile_result = pstats.Stats(profile) profile_result.print_stats()
มาดูโปรไฟล์เอาต์พุตที่สร้างขึ้นให้ละเอียดยิ่งขึ้น:
เมื่อคุณสร้างโปรไฟล์สคริปต์ขนาดใหญ่ มันจะมีประโยชน์มาก จัดเรียงผลลัพธ์ตามเวลาดำเนินการ. หากต้องการทำเช่นนั้นคุณสามารถโทร sort_stats
บนวัตถุโปรไฟล์และเรียงลำดับตามเวลาดำเนินการ:
...
if __name__ == "__main__": with cProfile.Profile() as profile: func(1000) another_func(20) useful_func([2, 8, 12, 4], 12) profile_result = pstats.Stats(profile) profile_result.sort_stats(pstats.SortKey.TIME) profile_result.print_stats()
เมื่อคุณรันสคริปต์แล้ว คุณควรจะเห็นผลลัพธ์ที่จัดเรียงตามเวลา:
ฉันหวังว่าคู่มือนี้จะช่วยคุณในการเริ่มต้นสร้างโปรไฟล์ใน Python โปรดจำไว้เสมอว่าการเพิ่มประสิทธิภาพไม่ควรต้องแลกมาด้วยความสามารถในการอ่าน หากคุณสนใจที่จะเรียนรู้เกี่ยวกับผู้สร้างโปรไฟล์รายอื่นๆ รวมถึงแพ็คเกจ Python ของบริษัทอื่น ลองดูสิ่งนี้ บทความเกี่ยวกับผู้สร้างโปรไฟล์ Python.
บาลา ปรียา ซี เป็นนักพัฒนาและนักเขียนด้านเทคนิคจากอินเดีย เธอชอบทำงานที่ผสมผสานระหว่างคณิตศาสตร์ การเขียนโปรแกรม วิทยาศาสตร์ข้อมูล และการสร้างเนื้อหา สาขาที่เธอสนใจและเชี่ยวชาญ ได้แก่ DevOps วิทยาศาสตร์ข้อมูล และการประมวลผลภาษาธรรมชาติ เธอชอบอ่าน เขียน เขียนโค้ด และดื่มกาแฟ! ปัจจุบัน เธอกำลังทำงานเพื่อเรียนรู้และแบ่งปันความรู้ของเธอกับชุมชนนักพัฒนาโดยเขียนบทช่วยสอน คู่มือวิธีใช้ บทวิจารณ์ และอื่นๆ อีกมากมาย
- เนื้อหาที่ขับเคลื่อนด้วย SEO และการเผยแพร่ประชาสัมพันธ์ รับการขยายวันนี้
- PlatoData.Network Vertical Generative Ai เพิ่มพลังให้กับตัวเอง เข้าถึงได้ที่นี่.
- เพลโตไอสตรีม. Web3 อัจฉริยะ ขยายความรู้ เข้าถึงได้ที่นี่.
- เพลโตESG. ยานยนต์ / EVs, คาร์บอน, คลีนเทค, พลังงาน, สิ่งแวดล้อม แสงอาทิตย์, การจัดการของเสีย. เข้าถึงได้ที่นี่.
- เพลโตสุขภาพ เทคโนโลยีชีวภาพและข่าวกรองการทดลองทางคลินิก เข้าถึงได้ที่นี่.
- ChartPrime. ยกระดับเกมการซื้อขายของคุณด้วย ChartPrime เข้าถึงได้ที่นี่.
- BlockOffsets การปรับปรุงการเป็นเจ้าของออฟเซ็ตด้านสิ่งแวดล้อมให้ทันสมัย เข้าถึงได้ที่นี่.
- ที่มา: https://www.kdnuggets.com/profiling-python-code-using-timeit-and-cprofile?utm_source=rss&utm_medium=rss&utm_campaign=profiling-python-code-using-timeit-and-cprofile
- :เป็น
- :ไม่
- 10
- 100000
- 12
- 13
- 15%
- 17
- 19
- 20
- 22
- 7
- 8
- 9
- a
- สามารถ
- เกี่ยวกับเรา
- ข้างบน
- อย่างแน่นอน
- การเข้าถึง
- พลอากาศเอก
- ข้าม
- การกระทำ
- เพิ่ม
- ทั้งหมด
- ด้วย
- เสมอ
- an
- และ
- ใด
- API
- เข้าใกล้
- เป็น
- พื้นที่
- AS
- At
- การเขียน
- เฉลี่ย
- ตาม
- BE
- ก่อน
- ที่ดีที่สุด
- ดีกว่า
- ทั้งสอง
- built-in
- แต่
- by
- โทรศัพท์
- ที่เรียกว่า
- โทร
- CAN
- สามารถรับ
- ความก้าวหน้า
- CFM
- ตรวจสอบ
- ใกล้ชิด
- รหัส
- การเข้ารหัส
- อย่างไร
- ร่วมกัน
- ชุมชน
- มี
- เนื้อหา
- การสร้างเนื้อหา
- สิ่งแวดล้อม
- ความสะดวกสบาย
- ราคา
- ควบคู่
- สร้าง
- การสร้าง
- การสร้าง
- ขณะนี้
- วงจร
- ข้อมูล
- วิทยาศาสตร์ข้อมูล
- ค่าเริ่มต้น
- ผู้พัฒนา
- DevOps
- do
- Dont
- แต่ละ
- ทั้งหมด
- เท่ากัน
- ตัวอย่าง
- ตัวอย่าง
- ดำเนินการ
- การปฏิบัติ
- แพง
- ความชำนาญ
- การแสดงออก
- เร็วขึ้น
- สองสาม
- เนื้อไม่มีมัน
- ปลาย
- ชื่อจริง
- ก้าวแรก
- ดังต่อไปนี้
- สำหรับ
- ราคาเริ่มต้นที่
- ฟังก์ชัน
- ฟังก์ชั่น
- ฟังก์ชั่น
- สร้าง
- ได้รับ
- ให้
- ดี
- มากขึ้น
- ให้คำแนะนำ
- คู่มือ
- จัดการ
- มี
- ได้ยิน
- ช่วย
- เป็นประโยชน์
- จะช่วยให้
- เธอ
- โปรดคลิกที่นี่เพื่ออ่านรายละเอียดเพิ่มเติม
- ความหวัง
- สรุป ความน่าเชื่อถือของ Olymp Trade?
- ทำอย่างไร
- อย่างไรก็ตาม
- HTML
- HTTPS
- i
- ความคิด
- แยกแยะ
- if
- นำเข้า
- ปรับปรุง
- in
- ประกอบด้วย
- รวมทั้ง
- ดัชนี
- อินเดีย
- ภายใน
- อยากเรียนรู้
- สนใจ
- อินเตอร์เฟซ
- การตัด
- IT
- KD นักเก็ต
- ความรู้
- ภาษา
- ใหญ่
- เรียนรู้
- การเรียนรู้
- น้อยที่สุด
- ห้องสมุด
- น่าจะ
- ยอดไลก์
- Line
- รายการ
- นาน
- ดู
- หลัก
- ทำ
- ผู้จัดการ
- หลาย
- คณิตศาสตร์
- อาจ..
- วัด
- วัด
- กล่าวถึง
- วิธี
- วิธีการ
- อาจ
- ขั้นต่ำ
- โมดูล
- โมดูล
- ข้อมูลเพิ่มเติม
- ที่มีชื่อ
- โดยธรรมชาติ
- ภาษาธรรมชาติ
- ประมวลผลภาษาธรรมชาติ
- จำเป็น
- จำเป็น
- ไม่เคย
- สังเกต..
- ตอนนี้
- จำนวน
- ตัวเลข
- วัตถุ
- การได้รับ
- of
- เสนอ
- มักจะ
- on
- ครั้งเดียว
- ONE
- เพียง
- ความคิดเห็น
- โอกาส
- การเพิ่มประสิทธิภาพ
- ตัวเลือกเสริม (Option)
- or
- อื่นๆ
- ของเรา
- ออก
- เอาท์พุต
- แพคเกจ
- ส่วนหนึ่ง
- ต่อ
- ชิ้น
- เพลโต
- เพลโตดาต้าอินเทลลิเจนซ์
- เพลโตดาต้า
- การปฏิบัติ
- นำเสนอ
- พิมพ์
- กระบวนการ
- การประมวลผล
- โปรไฟล์
- โปรไฟล์
- การเขียนโปรแกรม
- โครงการ
- ให้
- หลาม
- คุณภาพ
- หุ้น
- พิสัย
- มาถึง
- การอ่าน
- หมายถึง
- จำ
- ทำซ้ำ
- แทนที่
- จำเป็นต้องใช้
- ทรัพยากร
- ผลสอบ
- กลับ
- รับคืน
- ราก
- วิ่ง
- วิ่ง
- ทำงาน
- s
- วิทยาศาสตร์
- ต้นฉบับ
- สคริปต์
- วินาที
- ส่วน
- เห็น
- ดูเหมือนว่า
- เห็น
- ชุด
- ชุดอุปกรณ์
- การติดตั้ง
- ใช้งานร่วมกัน
- เธอ
- สั้น
- น่า
- แสดง
- ง่าย
- ช้า
- เล็ก
- So
- ซอฟต์แวร์
- ที่ระบุไว้
- มาตรฐาน
- ข้อความที่เริ่ม
- คำแถลง
- สถิติ
- ขั้นตอน
- เหมาะสม
- ยิ่งใหญ่
- วากยสัมพันธ์
- T1
- เอา
- ใช้เวลา
- เป้า
- น้ำตาตก
- วิชาการ
- กว่า
- ที่
- พื้นที่
- พวกเขา
- แล้วก็
- ที่นั่น
- ของบุคคลที่สาม
- นี้
- สาม
- ตลอด
- เวลา
- หมดเวลา
- ครั้ง
- ไปยัง
- เกินไป
- รวม
- บทเรียน
- อูบุนตู
- us
- ใช้
- มือสอง
- ใช้
- การใช้
- ความคุ้มค่า
- ความคุ้มค่า
- we
- เมื่อ
- ในขณะที่
- ใคร
- จะ
- กับ
- การทำงาน
- โรงงาน
- นักเขียน
- การเขียน
- เธอ
- ของคุณ
- ลมทะเล