ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน timeit จากโมดูล timeit ของ Python คุณจะได้เรียนรู้วิธีจับเวลานิพจน์และฟังก์ชันอย่างง่ายใน Python
การตั้งเวลาโค้ดของคุณจะช่วยให้คุณได้รับค่าประมาณของเวลาดำเนินการของโค้ดหนึ่งๆ และยังระบุส่วนของโค้ดที่จำเป็นต้องปรับให้เหมาะสมอีกด้วย
เราจะเริ่มต้นด้วยการเรียนรู้ไวยากรณ์ของฟังก์ชัน timeit ของ Python จากนั้นเราจะเขียนโค้ดตัวอย่างเพื่อทำความเข้าใจวิธีใช้โค้ดกับบล็อกเวลาของโค้ดและฟังก์ชันในโมดูล Python ของคุณ เอาล่ะ.
วิธีใช้ฟังก์ชัน Python timeit
โมดูล timeit เป็นส่วนหนึ่งของไลบรารีมาตรฐานของ Python และคุณสามารถนำเข้าได้:
import timeit
ไวยากรณ์ที่จะใช้ฟังก์ชัน timeit จากโมดูล timeit มีดังต่อไปนี้:
timeit.timeit(stmt, setup, number)
ที่นี่:
- stmt เป็นส่วนของโค้ดที่จะวัดเวลาดำเนินการ คุณสามารถระบุเป็นสตริง Python อย่างง่ายหรือสตริงหลายบรรทัด หรือส่งผ่านชื่อที่เรียกได้
- ตามชื่อที่แนะนำ การตั้งค่าหมายถึงชิ้นส่วนของโค้ดที่ต้องเรียกใช้เพียงครั้งเดียว ซึ่งมักเป็นข้อกำหนดเบื้องต้นเพื่อให้ stmt ทำงานได้ ตัวอย่างเช่น สมมติว่าคุณกำลังคำนวณเวลาการดำเนินการสำหรับการสร้างอาร์เรย์ NumPy ในกรณีนี้ การนำเข้า numpy คือรหัสการตั้งค่า และการสร้างจริงคือคำสั่งที่ต้องจับเวลา
- หมายเลขพารามิเตอร์แสดงถึงจำนวนครั้งที่รัน stmt ค่าดีฟอลต์ของตัวเลขคือ 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 ที่บรรทัดคำสั่ง ตัวเลือกการทำซ้ำ r จะถูกตั้งค่าเป็นค่าเริ่มต้นที่ 5 ซึ่งหมายความว่าการดำเนินการของ stmt สำหรับจำนวนครั้งที่ระบุจะถูกทำซ้ำห้าครั้ง และเวลาการดำเนินการที่ดีที่สุดจะถูกส่งคืน
การวิเคราะห์วิธีการกลับรายการสตริงโดยใช้ timeit
เมื่อทำงานกับสตริง Python คุณอาจต้องการย้อนกลับ วิธีทั่วไปสองวิธีในการกลับสตริงมีดังนี้:
- การใช้การแบ่งส่วนสตริง
- การใช้ฟังก์ชัน reverse() และเมธอด join()
ย้อนกลับสตริง Python โดยใช้การแบ่งส่วนสตริง
มาดูกันว่าการแบ่งส่วนสตริงทำงานอย่างไร และคุณสามารถใช้เพื่อย้อนกลับสตริง Python ได้อย่างไร การใช้ไวยากรณ์บางสตริง[start:stop] ส่งคืนส่วนของสตริงที่เริ่มต้นที่ดัชนีเริ่มต้นและขยายจนถึงดัชนี stop-1 ลองมาเป็นตัวอย่าง
พิจารณาสตริงต่อไปนี้ ‘Python’ สตริงมีความยาว 6 และรายการดัชนีคือ 0, 1, 2 ถึง 5
>>> string_1 = 'Python'
เมื่อคุณระบุทั้งค่าเริ่มต้นและค่าหยุด คุณจะได้รับชิ้นส่วนสตริงที่ขยายจากจุดเริ่มต้นไปยังจุดหยุด-1 ดังนั้น string_1[1:4] ส่งกลับ ‘yth’
>>> string_1 = 'Python' >>> string_1[1:4] 'yth'
เมื่อคุณไม่ระบุค่าเริ่มต้น ระบบจะใช้ค่าเริ่มต้นเริ่มต้นเป็นศูนย์ และชิ้นส่วนจะเริ่มต้นที่ดัชนีศูนย์และขยายจนถึงจุดหยุด – 1
ที่นี่ ค่าหยุดคือ 3 ดังนั้นชิ้นเริ่มต้นที่ดัชนี 0 และขึ้นไปยังดัชนี 2
>>> string_1[:3] 'Pyt'
เมื่อคุณไม่รวมดัชนีหยุด คุณจะเห็นว่าชิ้นส่วนเริ่มต้นจากดัชนีเริ่มต้น (1) และขยายไปจนถึงจุดสิ้นสุดของสตริง
>>> string_1[1:] 'ython'
การละเว้นทั้งค่าเริ่มต้นและค่าหยุดจะส่งกลับส่วนของสตริงทั้งหมด
>>> string_1[::] 'Python'
มาสร้างชิ้นส่วนด้วยค่าขั้นตอน ตั้งค่าเริ่มต้น หยุด และขั้นตอนเป็น 1, 5 และ 2 ตามลำดับ เราจะได้ชิ้นส่วนของสตริงที่เริ่มต้นที่ 1 ขยายไปถึง 4 (ไม่รวมจุดสิ้นสุด 5) ที่มีอักขระทุกวินาที
>>> string_1[1:5:2] 'yh'
เมื่อคุณใช้ขั้นตอนเชิงลบ คุณจะได้รับชิ้นส่วนที่เริ่มต้นที่ส่วนท้ายของสตริง เมื่อตั้งค่าขั้นตอนเป็น -2, string_1[5:2:-2] ให้ชิ้นต่อไปนี้:
>>> string_1[5:2:-2] 'nh'
เพื่อให้ได้รับสำเนาของสตริงที่กลับด้าน เราข้ามค่าเริ่มต้นและจุดสิ้นสุดและตั้งค่าขั้นตอนเป็น -1 ดังที่แสดง:
>>> string_1[::-1] 'nohtyP'
โดยสรุป: สตริง[::-1] ส่งคืนสำเนาของสตริงที่ย้อนกลับ
การย้อนกลับสตริงโดยใช้ฟังก์ชันในตัวและวิธีการสตริง
ฟังก์ชัน reverse() ในตัวใน 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() บนตัววนซ้ำแบบย้อนกลับโดยใช้ไวยากรณ์:
ข้อมูลโค้ดด้านล่างแสดงตัวอย่างบางส่วนที่ตัวคั่นเป็นยัติภังค์และช่องว่างตามลำดับ
>>> '-'.join(reversed(string1)) 'n-o-h-t-y-P' >>> ' '.join(reversed(string1)) 'n o h t y P'
ที่นี่ เราไม่ต้องการตัวคั่นใดๆ ดังนั้นตั้งค่าตัวคั่นเป็นสตริงว่างเพื่อรับสำเนาของสตริงที่กลับด้าน:
>>> ''.join(reversed(string1)) 'nohtyP'
การใช้ ”.join(reversed(some-string)) จะส่งกลับสำเนาของสตริงที่ย้อนกลับ
การเปรียบเทียบเวลาดำเนินการโดยใช้ timeit
จนถึงตอนนี้ เราได้เรียนรู้สองวิธีในการย้อนกลับสตริง Python แต่อันไหนเร็วกว่ากัน? ลองหากัน
ในตัวอย่างก่อนหน้านี้ที่เราตั้งเวลานิพจน์ Python อย่างง่าย เราไม่มีรหัสการตั้งค่าใดๆ ที่นี่เรากำลังย้อนกลับสตริง Python ในขณะที่การดำเนินการกลับรายการสตริงทำงานตามจำนวนครั้งที่ระบุตามหมายเลข รหัสการตั้งค่าคือการเริ่มต้นของสตริงที่จะทำงานเพียงครั้งเดียว
>>> 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() และฟังก์ชัน reverse()
ฟังก์ชัน 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() โดยมีรายการสตริงเป็นอาร์กิวเมนต์ ต่อไป เรามากำหนดรหัสการตั้งค่ากัน คุณเดาได้ไหมว่ารหัสการตั้งค่าควรเป็นอย่างไร
สำหรับการเรียกใช้ฟังก์ชันให้สำเร็จ รหัสการตั้งค่าควรมีดังต่อไปนี้:
- นิยามของฟังก์ชัน hasDigit()
- การเริ่มต้นรายการอาร์กิวเมนต์ของสตริง
มากำหนดรหัสการตั้งค่าในสตริงการตั้งค่าดังที่แสดงด้านล่าง:
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