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

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน 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 เพื่อกำหนดรหัสการตั้งค่า
  วิธีการตั้งค่าการแชร์ NFS บน OpenMediaVault

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

$ 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) ที่มีอักขระทุกวินาที

  ใบสั่งงานคืออะไร? [+ 4 Templates]

>>> 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(some-string))

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

>>> '-'.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() โดยมีรายการสตริงเป็นอาร์กิวเมนต์ ต่อไป เรามากำหนดรหัสการตั้งค่ากัน คุณเดาได้ไหมว่ารหัสการตั้งค่าควรเป็นอย่างไร

  คุณสามารถปิดการใช้งานโฆษณาบนหน้าจอหลักของ Roku ได้หรือไม่?

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

  • นิยามของฟังก์ชัน 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

เรื่องล่าสุด

x