φυβλαςのβλογ
บล็อกของ phyblas



การวัดเวลาในการทำงานของโปรแกรมใน python
เขียนเมื่อ 2016/06/10 22:26
แก้ไขล่าสุด 2021/09/28 16:42
บางครั้งการเขียนโปรแกรมไม่ใช่เพียงแค่ให้ได้ผลลัพธ์ตามที่ต้องการได้ก็ เพียงพอแล้ว บางทีเราสามารถทำตามต้องการได้แต่โปรแกรมทำงานช้ามากก็ไม่สะดวกที่จะใช้

ดังนั้นจึงจำเป็นจะต้องพยายามเขียนโปรแกรมให้ประหยัดเวลาในการทำงานมากที่สุด

เมื่อที่จะรู้ว่าโปรแกรมแบบไหนประหยัดเวลาหรือกินเวลาได้นั้นเราจำเป็นจะต้องวัดเวลาที่ใช้ไปในแต่ละการทำงาน

ภาษาไพธอนมีมอดูลที่ใช้ทำงานเกี่ยวกับเรื่องเวลาอยู่คือมอดูล 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 นั้นเร็วกว่ามากทั้งการสร้างข้อมูลและการคำนวณ



อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文