Timeit

ก่อนที่จะวัดความเร็ว มี 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

สังเกตว่ารูปแบบการพิมพ์ผลลัพท์ที่ได้จะต่างออกไปเล็กน้อยนะครับ

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus