ใช้ 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 อย่างง่าย
ในส่วนนี้ เราจะพยายามวัดเวลาการดำเนินการของนิพจน์ 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()
ย้อนกลับสตริง Python โดยใช้การแบ่งส่วนสตริง
มาดูกันว่าการแบ่งส่วนสตริงทำงานอย่างไร และคุณสามารถใช้เพื่อย้อนกลับสตริง Python ได้อย่างไร การใช้ไวยากรณ์ some-string[start:stop]
จะส่งกลับส่วนของสตริงที่เริ่มต้นที่ดัชนี start
และขยายจนถึงดัชนี stop-1
ลองมาเป็นตัวอย่าง
พิจารณาสตริงต่อไปนี้ 'Python' สตริงมีความยาว 6 และรายการดัชนีคือ 0, 1, 2 ถึง 5
>>> string_1 = 'Python'
เมื่อคุณระบุทั้งค่า start
และค่า stop
คุณจะได้รับชิ้นส่วนสตริงที่ขยายจาก start
ถึง stop-1
ดังนั้น string_1[1:4]
จะคืนค่า 'yth'
>>> string_1 = 'Python' >>> string_1[1:4] 'yth'
เมื่อคุณไม่ระบุค่า start
ระบบจะใช้ค่าเริ่มต้น start
เป็นศูนย์ และชิ้นส่วนจะเริ่มต้นที่ดัชนีศูนย์และขยายจนถึง stop - 1
ที่นี่ ค่า stop
คือ 3 ดังนั้นชิ้นเริ่มต้นที่ดัชนี 0 และขึ้นไปยังดัชนี 2
>>> string_1[:3] 'Pyt'
เมื่อคุณไม่รวมดัชนี stop
คุณจะเห็นว่าชิ้นส่วนเริ่มต้นจากดัชนี start
(1) และขยายไปจนถึงจุดสิ้นสุดของสตริง
>>> string_1[1:] 'ython'
การละเว้นทั้งค่า start
และค่า stop
จะส่งกลับส่วนของสตริงทั้งหมด
>>> string_1[::] 'Python'
มาสร้างชิ้นส่วนด้วยค่า step
ตั้งค่า start
stop
และ step
เป็น 1, 5 และ 2 ตามลำดับ เราได้รับชิ้นส่วนของสตริงที่เริ่มต้นที่ 1 ขยายไปถึง 4 (ไม่รวมจุดสิ้นสุด 5) ที่มี อักขระทุกวินาที
>>> string_1[1:5:2] 'yh'
เมื่อคุณใช้ขั้นตอนเชิงลบ คุณจะได้รับชิ้นส่วนที่เริ่มต้นที่ส่วนท้ายของสตริง เมื่อตั้งค่าขั้นตอนเป็น -2 แล้ว string_1[5:2:-2]
ให้ส่วนต่อไปนี้:
>>> 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
ในหัวข้อนี้ เราจะมาเรียนรู้วิธีการจับเวลาฟังก์ชัน 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