Python: เมื่อ x+x ไม่เท่ากับ x*2

รูปภาพของ hiddenmin

السلام عليكم ورحمة الله وبركاته

วันนี้เกิดความรู้สึกแปลกๆ ในประสิทธิภาพของ Python ก็เลยลองหาข้อมูลดูนิดหน่อยก็พบกับ PythonSpeed PerformanceTips เนื้อหาโดยรวมก็โอเคแต่รู้สึกแปลกใจกับหัวข้อ Python is not C ที่บอกถึงความแตกต่างในการใช้ operator ต่างๆ ในการประมวลผล

บทความนั้นได้ยกตัวอย่างถึงการใช้ *, << และ + ซึ่งมีผลลัทธ์ทางคณิตศาตร์เหมือนกัน แต่ให้ประสิทธิภาพด้านเวลาไม่เหมือน ว่าแล้วก็ต้องทดลองดูเองสักหน่อย

ขั้นแรกก็ต้องโหลดไฟล์ timeit.py มาก่อนจากลิ้งนี้ (คลิก raw ทีเมนูทางขวามือ)

จากนั้นก็จัดให้มันเข้าที่เข้าทางสักหน่อย เวลาเรียกใช้ครั้งต่อไปจะได้สะดวก (สำหรับสาวก Linux เท่านั้น!!)

$ sudo chmod +x timeit.py
$ sudo cp timeit.py /usr/local/bin

จากนั้นมาลองทดสอบกัน ผลที่ได้ก็ประมาณนี้

$ timeit.py -s 'x = 45' 'x * 2'
10000000 loops, best of 3: 0.0507 usec per loop
$ timeit.py -s 'x = 45' 'x << 1'
10000000 loops, best of 3: 0.0467 usec per loop
$ timeit.py -s 'x = 45' 'x + x'
10000000 loops, best of 3: 0.034 usec per loop

สรุปคือ การใช้ +, << และ * ทำความเร็วได้ดีต่างกันเรียงจากมากไปน้อย

ในขณะเดียวนั้นบทความนั้นได้กล่าวถึงภาษา C ว่า operator ทั้ง 3 ตัวนั้นให้ประสิทธิภาพที่ไม่แตกต่างกัน (เข้าไปอ่านกันเองนะ) เนื่องจากภาษาคอมพิวเตอร์สมัยใหม่ (แล้ว Python เป็นภาษาโบราณหรือไงฟร่ะ) แปลงการดำเนินการทางคณิตศาสตร์ (arithmetic operations) แต่ละตัวให้เป็นคำสั่งเครื่อง (machine instruction) แบบคำสั่งเดียวแล้ว หมายความว่าจะเลือกใช้ตัวไหนก็ไม่ใช่เรื่องสำคัญ

Tags: