Nattawut Phetmak
Jack of all Trades
ก่อนที่จะวัดความเร็ว มี 2 ฟังก์ชันที่ควรรู้จักคือ eval
และ exec
ซึ่งจะทำการรับ code ที่เก็บเป็น string มารัน
print(eval('2 * 3 * 7'))
# get: 42
x = 3
exec('x = 7')
print(x)
# get: 7
ความแตกต่างคือ eval
จะสามารถใช้ได้กับ expression เท่านั้น ไม่สามารถใช้กับ statement ได้ (คือไม่สามารถกำหนดค่าให้กับตัวแปรได้นั่นเอง)
การวัดความเร็วสามารถทำได้โดยฟังก์ชัน timeit
จากโมดูล timeit
โดยส่งผ่าน code เข้าไปเช่นนี้
from timeit import timeit
# compare time creating list [0, 2, 4, 6, 8]
print(timeit('list(range(0, 10, 2))'))
# get: 0.988918 sec
print(timeit('list(range(10))[::2]'))
# get: 1.358130 sec
print(timeit('[i for i in range(10) if i %2 == 0]'))
# get: 2.965018 sec
ตัวเลือกหนึ่งที่น่าสนใจคือ number ซึ่งหมายถึงรอบที่ใช้ทดลองเพื่อหาเวลารวม (ค่าปริยายคือหนึ่งล้าน) ถ้ารู้สึกว่าใช้เวลาทดลองนานเกินไปก็ลดรอบได้
print(timeit('[i for i in range(10) if i %2 == 0]', number=500000))
# get: 1.463683 sec
ส่วนการจะทดสอบ function ที่เขียนไว้ล่วงหน้าแล้ว ก็ทำได้ผ่านการ setup เช่นนี้
def fast_strict():
return [0, 2, 4, 6, 8]
print(timeit('fast_strict()', setup='from __main__ import fast_strict'))
# get: 0.315065 sec
หรือถ้าหากต้องการทดสอบจาก shell ก็สามารถสั่งแบบนี้ได้
$ python -m timeit "(lambda: [0,2,4,6,8])()"
1000000 loops, best of 3: 0.422 usec per loop
สังเกตว่ารูปแบบการพิมพ์ผลลัพท์ที่ได้จะต่างออกไปเล็กน้อยนะครับ