บางครั้งการเขียนโปรแกรมไม่ใช่เพียงแค่ให้ได้ผลลัพธ์ตามที่ต้องการได้ก็ เพียงพอแล้ว บางทีเราสามารถทำตามต้องการได้แต่โปรแกรมทำงานช้ามากก็ไม่สะดวกที่จะใช้
ดังนั้นจึงจำเป็นจะต้องพยายามเขียนโปรแกรมให้ประหยัดเวลาในการทำงานมากที่สุด
เมื่อที่จะรู้ว่าโปรแกรมแบบไหนประหยัดเวลาหรือกินเวลาได้นั้นเราจำเป็นจะต้องวัดเวลาที่ใช้ไปในแต่ละการทำงาน
ภาษาไพธอนมีมอดูลที่ใช้ทำงานเกี่ยวกับเรื่องเวลาอยู่คือมอดูล time
ฟังก์ชัน time ที่อยู่ในมอดูล time มีไว้ใช้สำหรับแสดงค่าเวลาในปัจจุบันออกมา
ลองพิมพ์
import time
print(time.time())
จะได้ค่าตัวเลขเป็นหลักพันล้านโผล่ขึ้นมา เลขนั้นคือระยะเวลาเป็นวินาทีนับจาก 1 ม.ค. 1970 เวลา 07:00:00 น. (สำหรับเขตเวลา +7)
สามารถนำมาแปลงเป็นวันเดือนปีและเวลาได้ด้วยฟังก์ชัน time.ctime
print(time.ctime(time.time())) # หรือ print(time.ctime())
จะได้เวลาปัจจุบันออกมา โดยจะแสดงแค่ถึงหลักวินาทีแต่ไม่ได้แสดงเลขทศนิยมด้วย
สามารถตรวจสอบค่าเวลาเริ่มต้นได้โดยพิมพ์
print(time.ctime(0))
จะได้
Thu Jan 1 07:00:00 1970
หรืออาจพิมพ์
print(time.localtime(0))
จะได้
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=7, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
ที่เป็น 07:00:00 เพราะว่าอยู่เมืองไทยซึ่งเป็นเขตเวลา +7 แต่ถ้าอยู่ญี่ปุ่นก็จะเป็น 09:00:00
หากต้องการหาเวลาที่เขตเวลามาตรฐานก็พิมพ์
time.gmtime(0)
จะได้
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
แต่เลขเวลาตรงนั้นไม่ได้สำคัญอะไร เราไม่จำเป็นจะต้องรู้ว่าเวลาขณะนั้นคือเมื่อไหร่ สิ่งที่เราต้องการหาจริงๆคือความต่างของเวลา สิ่งที่จะแสดงว่าโปรแกรมใช้เวลาทำงานนานแค่ไหน
นั่นคือต้องจับเวลาตอนเริ่มโปรแกรม และจับเวลาอีกครั้งเมื่อสิ้นสุดโปรแกรม จากนั้นก็นำค่าที่ได้มาลบกัน
t0 = time.time() # เวลาเริ่มต้น
<กลุ่มคำสั่งที่ต้องการจับเวลา>
print(time.time() - t0) # พิมพ์เวลาสุดท้ายลบด้วยเวลาเริ่มต้น
ตัวอย่างการใช้ เช่นลองวัดเวลาในการวนทำซ้ำด้วย for สิบล้านครั้งโดยไม่ได้ทำอะไรนอกจากปล่อยเวลาให้มันผ่านไป
t0 = time.time()
for i in range(10000000):
'ปล่อยเวลาให้มันผ่านไป'
t = time.time()
print(t-t0) # ได้ 0.8062782287597656
เลขที่ได้ในแต่ละรอบจะไม่เท่ากัน อาจต้องลองดูหลายๆครั้งเพื่อหาแนวโน้ม เท่านี้ก็จะเปรียบเทียบได้ว่าอย่างไหนเร็วกว่ากัน
ลองยกตัวอย่างการเปรียบเทียบมาดูสักอย่าง ลองเปรียบเทียบการสร้างข้อมูลตัวเลขเรียงกันล้านตัว จากนั้นก็นำมาคำนวณหาค่า sin ซึ่งมีอยู่สองวิธีคือใช้ลิสต์ธรรมดา กับใช้อาเรย์ของ numpy
ใช้ลิสต์ธรรมดา
import math
# สร้าง
t0 = time.time()
xxx = list(range(10000000))
t1 = time.time()
print('เวลาในการสร้าง: %f'%(t1-t0))
# คำนวณ
t0 = time.time()
yyy = [math.sin(x) for x in xxx]
t1 = time.time()
print('เวลาในการคำนวณ: %f'%(t1-t0))
ผลลัพธ์
เวลาในการสร้าง: 2.392641
เวลาในการคำนวณ: 8.910431
ใช้อาเรย์ของ numpy
import numpy as np
# สร้าง
t0 = time.time()
xxx = np.arange(10000000)
t1 = time.time()
print('เวลาในการสร้าง: %f'%(t1-t0))
# คำนวณ
t0 = time.time()
yyy = np.sin(xxx)
t1 = time.time()
print('เวลาในการคำนวณ: %f'%(t1-t0))
ผลลัพธ์
เวลาในการสร้าง: 0.033598
เวลาในการคำนวณ: 0.566093
ซึ่งจากผลลัพธ์จะเห็นได้ว่าการใช้อาเรย์ของ numpy นั้นเร็วกว่ามากทั้งการสร้างข้อมูลและการคำนวณ
อ้างอิง