ใช้ Python Timeit เพื่อตั้งเวลารหัสของคุณ

เผยแพร่แล้ว: 2023-01-17

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน timeit จากโมดูล timeit ของ Python คุณจะได้เรียนรู้วิธีจับเวลานิพจน์และฟังก์ชันอย่างง่ายใน Python

การตั้งเวลาโค้ดของคุณจะช่วยให้คุณได้รับค่าประมาณของเวลาดำเนินการของโค้ดหนึ่งๆ และยังระบุส่วนของโค้ดที่จำเป็นต้องปรับให้เหมาะสมอีกด้วย

เราจะเริ่มต้นด้วยการเรียนรู้ไวยากรณ์ของฟังก์ชัน timeit ของ Python จากนั้นเราจะเขียนโค้ดตัวอย่างเพื่อทำความเข้าใจวิธีใช้โค้ดกับบล็อกเวลาของโค้ดและฟังก์ชันในโมดูล Python ของคุณ เอาล่ะ.

วิธีใช้ฟังก์ชัน Python timeit

โมดูล timeit เป็นส่วนหนึ่งของไลบรารีมาตรฐานของ Python และคุณสามารถนำเข้าได้:

 import timeit

ไวยากรณ์ที่จะใช้ฟังก์ชัน timeit จากโมดูล timeit มีดังต่อไปนี้:

 timeit.timeit(stmt, setup, number)

ที่นี่:

  • stmt เป็นส่วนของโค้ดที่จะวัดเวลาดำเนินการ คุณสามารถระบุเป็นสตริง Python อย่างง่ายหรือสตริงหลายบรรทัด หรือส่งผ่านชื่อที่เรียกได้
  • ตามชื่อที่แนะนำ setup หมายถึงชิ้นส่วนของโค้ดที่ต้องเรียกใช้เพียงครั้งเดียว ซึ่งมักเป็นข้อกำหนดเบื้องต้นเพื่อให้ stmt ทำงานได้ ตัวอย่างเช่น สมมติว่าคุณกำลังคำนวณเวลาการดำเนินการสำหรับการสร้างอาร์เรย์ NumPy ในกรณีนี้ การนำเข้า numpy คือรหัส setup และการสร้างจริงคือคำสั่งที่ต้องจับเวลา
  • number พารามิเตอร์แสดงถึงจำนวนครั้งที่รัน stmt ค่าดีฟอลต์ของ number คือ 1 ล้าน (1000000) แต่คุณสามารถตั้งค่าพารามิเตอร์นี้เป็นค่าอื่นๆ ที่คุณต้องการได้เช่นกัน

ตอนนี้เราได้เรียนรู้ไวยากรณ์ในการใช้ฟังก์ชัน timeit() แล้ว เรามาเริ่มเขียนโค้ดตัวอย่างกัน

เวลานิพจน์ Python อย่างง่าย

Timing-Simple-Python-นิพจน์

ในส่วนนี้ เราจะพยายามวัดเวลาการดำเนินการของนิพจน์ Python อย่างง่ายโดยใช้ timeit

เริ่ม Python REPL และรันตัวอย่างโค้ดต่อไปนี้ ที่นี่ เรากำลังคำนวณเวลาการดำเนินการของการยกกำลังและการดำเนินการแบ่งพื้นสำหรับ 10,000 และ 100,000 รอบ

ขอให้สังเกตว่าเราส่งผ่านคำสั่งเพื่อจับเวลาเป็นสตริง Python และใช้เครื่องหมายอัฒภาคเพื่อแยกนิพจน์ต่าง ๆ ในคำสั่ง

 >>> import timeit >>> timeit.timeit('3**4;3//4',number=10000) 0.0004020999999738706 >>> timeit.timeit('3**4;3//4',number=100000) 0.0013780000000451764

เรียกใช้ Python timeit ที่ Command Line

คุณยังสามารถใช้ timeit ที่บรรทัดคำสั่ง นี่คือบรรทัดคำสั่งที่เทียบเท่ากับการเรียกใช้ฟังก์ชัน timeit:

 $ python-m timeit -n [number] -s [setup] [stmt]
  • python -m timeit แสดงว่าเราเรียกใช้ timeit เป็นโมดูลหลัก
  • n เป็นตัวเลือกบรรทัดคำสั่งที่แสดงจำนวนครั้งที่ควรรันโค้ด นี่เทียบเท่ากับอาร์กิวเมนต์ number ในการเรียกใช้ฟังก์ชัน timeit()
  • คุณสามารถใช้ตัวเลือก -s เพื่อกำหนดรหัสการตั้งค่า

ที่นี่ เราเขียนตัวอย่างก่อนหน้านี้ใหม่โดยใช้บรรทัดคำสั่งเทียบเท่า:

 $ python -m timeit -n 100000 '3**4;3//4' 100000 loops, best of 5: 35.8 nsec per loop

ในตัวอย่างนี้ เราคำนวณเวลาดำเนินการของฟังก์ชันในตัว len() การเริ่มต้นของสตริงคือรหัสการตั้งค่าที่ส่งผ่านโดยใช้ตัวเลือก s

 $ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)' 100000 loops, best of 5: 239 nsec per loop

ในผลลัพธ์ สังเกตว่าเราได้รับเวลาดำเนินการสำหรับการรัน ที่ดีที่สุด 5 ครั้ง สิ่งนี้หมายความว่า? เมื่อคุณเรียกใช้ timeit ที่บรรทัดคำสั่ง ตัวเลือกการ repeat r จะถูกตั้งค่าเป็น ค่าเริ่มต้น ที่ 5 ซึ่งหมายความว่าการดำเนินการของ stmt สำหรับ number ครั้งที่ระบุจะถูกทำซ้ำห้าครั้ง และเวลาการดำเนินการที่ดีที่สุดจะถูกส่งคืน

การวิเคราะห์วิธีการกลับรายการสตริงโดยใช้ timeit

เมื่อทำงานกับสตริง Python คุณอาจต้องการย้อนกลับ วิธีทั่วไปสองวิธีในการกลับสตริงมีดังนี้:

  • การใช้การแบ่งส่วนสตริง
  • การใช้ฟังก์ชัน reversed() และเมธอด join()
การวิเคราะห์ของสตริงการกลับรายการวิธีการโดยใช้ timeit

ย้อนกลับสตริง Python โดยใช้การแบ่งส่วนสตริง

มาดูกันว่าการแบ่งส่วนสตริงทำงานอย่างไร และคุณสามารถใช้เพื่อย้อนกลับสตริง Python ได้อย่างไร การใช้ไวยากรณ์ some-string[start:stop] จะส่งกลับส่วนของสตริงที่เริ่มต้นที่ดัชนี start และขยายจนถึงดัชนี stop-1 ลองมาเป็นตัวอย่าง

พิจารณาสตริงต่อไปนี้ 'Python' สตริงมีความยาว 6 และรายการดัชนีคือ 0, 1, 2 ถึง 5

อิมเมจ-76
 >>> string_1 = 'Python'

เมื่อคุณระบุทั้งค่า start และค่า stop คุณจะได้รับชิ้นส่วนสตริงที่ขยายจาก start ถึง stop-1 ดังนั้น string_1[1:4] จะคืนค่า 'yth'

อิมเมจ-77
 >>> string_1 = 'Python' >>> string_1[1:4] 'yth'

เมื่อคุณไม่ระบุค่า start ระบบจะใช้ค่าเริ่มต้น start เป็นศูนย์ และชิ้นส่วนจะเริ่มต้นที่ดัชนีศูนย์และขยายจนถึง stop - 1

อิมเมจ-78

ที่นี่ ค่า stop คือ 3 ดังนั้นชิ้นเริ่มต้นที่ดัชนี 0 และขึ้นไปยังดัชนี 2

 >>> string_1[:3] 'Pyt'

เมื่อคุณไม่รวมดัชนี stop คุณจะเห็นว่าชิ้นส่วนเริ่มต้นจากดัชนี start (1) และขยายไปจนถึงจุดสิ้นสุดของสตริง

ภาพ-80
 >>> string_1[1:] 'ython'

การละเว้นทั้งค่า start และค่า stop จะส่งกลับส่วนของสตริงทั้งหมด

ภาพ-81
 >>> string_1[::] 'Python'

มาสร้างชิ้นส่วนด้วยค่า step ตั้งค่า start stop และ step เป็น 1, 5 และ 2 ตามลำดับ เราได้รับชิ้นส่วนของสตริงที่เริ่มต้นที่ 1 ขยายไปถึง 4 (ไม่รวมจุดสิ้นสุด 5) ที่มี อักขระทุกวินาที

อิมเมจ-82
 >>> string_1[1:5:2] 'yh'

เมื่อคุณใช้ขั้นตอนเชิงลบ คุณจะได้รับชิ้นส่วนที่เริ่มต้นที่ส่วนท้ายของสตริง เมื่อตั้งค่าขั้นตอนเป็น -2 แล้ว string_1[5:2:-2] ให้ส่วนต่อไปนี้:

ภาพ-83
 >>> string_1[5:2:-2] 'nh'

เพื่อให้ได้รับสำเนาของสตริงที่กลับด้าน เราข้ามค่า start และ stop และตั้งค่าขั้นตอนเป็น -1 ดังที่แสดง:

 >>> string_1[::-1] 'nohtyP'

โดยสรุป: string[::-1] ส่งคืนสำเนาของสตริงที่ย้อนกลับ

การย้อนกลับสตริงโดยใช้ฟังก์ชันในตัวและวิธีการสตริง

ฟังก์ชัน reverse reversed() ในตัวใน Python จะส่งคืนตัววนซ้ำแบบย้อนกลับเหนือองค์ประกอบของสตริง

 >>> string_1 = 'Python' >>> reversed(string_1) <reversed object at 0x00BEAF70>

ดังนั้นคุณสามารถวนซ้ำตัววนซ้ำโดยใช้ for วนซ้ำ:

 for char in reversed(string_1): print(char)

และเข้าถึงองค์ประกอบของสตริงในลำดับย้อนกลับ

 # Output n o h t y P

จากนั้น คุณสามารถเรียกใช้เมธอด join() บนตัววนซ้ำแบบย้อนกลับด้วยไวยากรณ์: <sep>.join(reversed(some-string))

ข้อมูลโค้ดด้านล่างแสดงตัวอย่างบางส่วนที่ตัวคั่นเป็นยัติภังค์และช่องว่างตามลำดับ

 >>> '-'.join(reversed(string1)) 'nohtyP' >>> ' '.join(reversed(string1)) 'nohty P'

ที่นี่ เราไม่ต้องการตัวคั่นใดๆ ดังนั้นตั้งค่าตัวคั่นเป็นสตริงว่างเพื่อรับสำเนาของสตริงที่กลับรายการ:

 >>> ''.join(reversed(string1)) 'nohtyP'

การใช้ ''.join(reversed(some-string)) จะส่งกลับสำเนาของสตริงที่ย้อนกลับ

การเปรียบเทียบเวลาดำเนินการโดยใช้ timeit

จนถึงตอนนี้ เราได้เรียนรู้สองวิธีในการย้อนกลับสตริง Python แต่อันไหนเร็วกว่ากัน? ลองหากัน

ในตัวอย่างก่อนหน้านี้ที่เราตั้งเวลานิพจน์ Python อย่างง่าย เราไม่มีรหัส setup ใดๆ ที่นี่เรากำลังย้อนกลับสตริง Python ในขณะที่การดำเนินการกลับรายการสตริงทำงานตามจำนวนครั้งที่ระบุด้วย number รหัส setup คือการเริ่มต้นของสตริงที่จะทำงานเพียงครั้งเดียว

 >>> import timeit >>> timeit.timeit(stmt = 'string_1[::-1]', setup = "string_1 = 'Python'", number = 100000) 0.04951830000001678 >>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000) 0.12858760000000302

สำหรับจำนวนการรันสำหรับการย้อนกลับสตริงที่กำหนดในจำนวนที่เท่ากัน วิธีการ แบ่งส่วนสตริง จะเร็วกว่าการใช้เมธอด join() และฟังก์ชัน reversed()

ฟังก์ชัน Timing Python โดยใช้ timeit

Timing-Python-Functions-Using-timeit

ในหัวข้อนี้ เราจะมาเรียนรู้วิธีการจับเวลาฟังก์ชัน Python ด้วยฟังก์ชัน timeit จากรายการสตริง ฟังก์ชัน hasDigit ต่อไปนี้จะส่งคืนรายการสตริงที่มีอย่างน้อยหนึ่งหลัก

 def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit

ตอนนี้เราต้องการวัดเวลาดำเนินการของฟังก์ชัน Python hasDigit() โดยใช้ timeit

ขั้นแรกให้ระบุคำสั่งที่จะกำหนดเวลา ( stmt ) เป็นการเรียกใช้ฟังก์ชัน hasDigit() โดยมีรายการสตริงเป็นอาร์กิวเมนต์ ต่อไป เรามากำหนดรหัส การตั้งค่า กัน คุณเดาได้ไหมว่ารหัส setup ควรเป็นอย่างไร

สำหรับการเรียกใช้ฟังก์ชันให้สำเร็จ รหัสการตั้งค่าควรมีดังต่อไปนี้:

  • นิยามของฟังก์ชัน hasDigit()
  • การเริ่มต้นรายการอาร์กิวเมนต์ของสตริง

มากำหนดรหัสการ setup ดังที่แสดงด้านล่าง:

 setup = """ def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit thislist=['puffin3','7frost','blue'] """

ต่อไป เราสามารถใช้ฟังก์ชัน timeit และรับเวลาดำเนินการของ hasDigit() สำหรับการรัน 100,000 ครั้ง

 import timeit timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
 # Output 0.2810094920000097

บทสรุป

คุณได้เรียนรู้วิธีใช้ ฟังก์ชัน timeit ของ Python ใน การแสดงเวลา ฟังก์ชัน และการเรียกใช้อื่นๆ แล้ว สิ่งนี้สามารถช่วยคุณเปรียบเทียบรหัสของคุณ เปรียบเทียบเวลาการดำเนินการของการใช้งานที่แตกต่างกันของฟังก์ชันเดียวกัน และอื่นๆ

มาทบทวนสิ่งที่เราได้เรียนรู้ในบทช่วยสอนนี้ คุณสามารถใช้ฟังก์ชัน timeit() กับไวยากรณ์ timeit.timeit(stmt=...,setup=...,number=...) หรือคุณสามารถเรียกใช้ timeit ที่บรรทัดคำสั่งเพื่อระบุเวลาสั้น ๆ ของโค้ด

ในขั้นตอนถัดไป คุณสามารถสำรวจวิธีการใช้แพ็คเกจการทำโปรไฟล์ Python อื่นๆ เช่น line-profiler และ memprofiler เพื่อจัดทำโปรไฟล์รหัสของคุณสำหรับเวลาและหน่วยความจำตามลำดับ

ต่อไป เรียนรู้วิธีคำนวณความแตกต่างของเวลาใน Python