φυβλαςのβλογ
บล็อกของ 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文