สำหรับคนที่เขียน Python หรือเป็นคนที่กำลังศึกษา Python น่าจะเคยได้ยินหลาย ๆ คนพูดว่า Python มันเป็นภาษาที่ทำงานได้ช้ามาก ๆ เมื่อเทียบกับภาษาอื่น ๆ อย่าง C และ C++ ที่แก๊งค์นั้นเขาทำงานได้เร็วมาก ๆ แต่ถ้าเราบอกว่า อยากให้โปรแกรมเร็ว เราก็ต้องไปเขียน C ทั้งหมดเลยนะ มันอาจจะเป็นเรื่องยากสำหรับหลาย ๆ งานที่มี Project ที่ทำงานด้วย Python มาก่อน แล้วอยู่ ๆ ต้องมาเขียนเป็น C ไหนจะเรื่อง Programmer อีกที่ต้องไปหามา ทั้งทำงานซ้ำซ้อน และ เสียเงินเพิ่มอีกหลายทอด
ถ้าเราบอกว่า มันมีวิธีที่ทำให้ Python Script ของเราเร็วขึ้นอีกละ ใช่แล้ว วันนี้เราจะพาทุกคนไปทำความรู้จักกับ PyPy กัน
ก่อนเราจะไปดูว่า PyPy มันทำให้ Python Script ของเราเร็วได้มากแค่ไหน เราอยากจะมาคุยกันก่อนว่า ทำไมหลาย ๆ คนบอกว่า Python ถึงทำงานได้ช้ากว่าภาษาอื่น ๆ เช่น C และ C++\
อยากให้นึกถึงเวลา เราเขียนโปรแกรมทั่ว ๆ ไป อย่างเราเอง เมื่อก่อน เราก็เขียนพวก C มาก่อน เวลาเราเขียนเสร็จ เราไม่สามารถเอา Code ที่เราเขียนขึ้นมาทำงานได้ตรง ๆ เลย เราจะต้องเอามันไปเข้าโปรแกรมหนึ่ง ที่เราเรียกว่า Compiler ก่อน และ Output เราจะได้เป็น Executable ออกมาให้เราเรียกทำงานได้
เบื้องหลังของมันคือ เมื่อเราเอา Code ของเราเข้า Compiler มันจะเข้าไปอ่านใน Source Code ของเรา และทำการแปลงมันให้อยู่ในรูปแบบที่เรียกว่า Machine Code ซึ่งเป็นภาษาที่เครื่องเข้าใจได้ทันที
ทำให้เมื่อเรารันโปรแกรมออกมา เครื่องก็สามารถเข้ามาอ่านที่ Machine Code โดยตรง ทำให้การทำงานเป็นไปได้อย่างรวดเร็วมาก ๆ แต่ปัญหาคือ Machine Code ของแต่ละที่มันก็ไม่เหมือนกัน เช่น เรา Compile บน Windows ไปแล้ว เราก็ไม่สามารถเอาไปรันบน Linux ได้
ถ้าจะเอาไปใช้ เราก็ต้องเอาไปผ่าน Compiler ของ OS และ สถาปัตยกรรม เครื่องที่เราต้องการเอาไปทำงานนั่นเอง นั่นคือข้อเสียของภาษาที่ทำงานในลักษณะนี้ ซึ่งเราเรียกภาษาพวกนี้ว่าเป็นพวก Compile Language
แต่ใน Python มีลักษณะการทำงานที่ไม่เหมือนกัน ถ้าเราลองสังเกตุ เราจะเห็นได้ว่า เมื่อเราเขียน Source Code ออกมา เราไม่จำเป็นที่จะต้องผ่านโปรแกรมอะไรเลย เราสามารถเรียก Python แล้วมันก็ทำงานได้เลย ซึ่งจริง ๆ ไส้ใน มีอะไรมากกว่านั้นนิดหน่อย
แทนที่เราจะ Compile โปรแกรมของเราไว้ก่อน เราบอกว่า ไม่เอาแล้ว เราอยากให้มันรันได้ทันทีเลย เลยเปลี่ยนวิธีใหม่เป็นว่า งั้นตอนรัน เราก็ค่อย ๆ อ่านทีละบรรทัดไปเลยดิ ใช่แล้ว เราเรียกโปรแกรมที่ทำแบบนี้ว่า Interpreter นั่นเอง
การใช้วิธีแบบนี้ ทำให้เราไม่ต้องมานั่ง Compile ไว้ก่อน เราก็แค่ส่ง Source Code ไปรันบนเครื่องไหนก็ได้ที่มี Python ติดตั้งอยู่ก็เรียบร้อยแล้ว สะดวกมาก ๆ แต่กลับกัน เพราะการที่เราไม่ได้ Compile ไว้ล่วงหน้านั่นแหละ ทำให้มันต้องมาทำระหว่างที่เรารันโปรแกรม ทำให้โปรแกรมของเราทำงานได้ช้านั่นเอง
มาถึงคำถามที่น่าสนใจแล้วว่า ทำไม PyPy มันถึงเร็วกว่า CPython ที่เราใช้กันปกติได้ ทั้ง ๆ ที่มันก็เป็น Python เหมือนกันแท้ ๆ ความลับของมันก็คือการนำสิ่งที่เรียกว่า Just-in-Time Compilation (JIT) เข้ามาใช้ นี่แหละคือความลับหลัก ๆ ของ PyPy เลย
จากเดิมที่ต้องอ่านทีละบรรทัดไปเรื่อย ๆ แปลงเป็น Byte Code ไม่เอาละ มันช้า มันบอกว่า มันจะอ่านทีละส่วนของ Code เหมือนกับที่ Interpreter ทำนั่นแหละ แทนที่มันจะอ่านแล้วแปลงเป็น Byte Code มันก็เล่นแปลงให้เป็น Machine Code ระหว่างที่ทำงานเลย เอาสิ !!!!!
ด้วยการทำงานผสมกัน ระหว่าง Interpreter ที่ทำให้เราไม่จำเป็นต้องมานั่ง Compile โปรแกรมล่วงหน้า กับ JIT รวมกัน ก็ทำให้ได้ Performance ที่โหดมาก ๆ ทำให้ PyPy เป็น Python ที่ทำให้ Python Script ของเราทำงานได้โหดมาก ๆ เลยทีเดียว
brew install pypy3
อ่านมาถึงตรงนี้แล้ว เชื่อว่าทุกคนน่าจะกำหมัด อยากลองใช้แล้ว เรามาลองติดตั้งกัน สำหรับใครที่ใช้ macOS หรือ Linux ก็สามารถติดตั้งง่าย ๆ ผ่าน Homebrew และ LinuxBrew ผ่านคำสั่งด้านบนได้เลย
ส่วน Windows ก็สามารถเข้าไปที่เว็บของ PyPy ทำการโหลด Executable มา และเซ็ต Environment ไปที่ Path ที่เราเก็บ PyPy ก็จะสามารถเรียก PyPy ได้แล้ว
import time
start_time = time.time()
counter = 0
for i in range(1000000000) :
counter += i
elapsed = time.time() - start_time
print("Result : ", counter)
print("Done in ", elapsed, " second(s)")
เรามาลองทำโปรแกรมง่าย ๆ เพื่อทำการทดสอบกันดีกว่า โปรแกรมที่เราเลือกมา จะเป็นโปรแกรมที่ต้องอาศัยการทำงานที่ค่อนข้างเยอะ เราเลือกการทำซ้ำหนัก ๆ มาละกัน ในที่นี้เราวนหลายสิบล้านรอบเลย แล้วบวกเลขออกมา พร้อมกับ Benchmark เป็นเวลาในการทำงานออกมา
เพื่อความสนุกมากขึ้น เราจะลองเขียนอีกโปรแกรมขึ้นมา ที่ทำงานเหมือนกัน แต่ เราจะใช้ C ดูว่ามันจะเป็นยังไง
#include <stdio.h>
#include <time.h>
int main () {
clock_t startTime, endTime;
double elapsed;
startTime = clock();
int counter = 0;
int i;
for (i=0; i<1000000000; i++) {
counter = counter + i;
}
endTime = clock();
elapsed = ((double) (endTime - startTime)) / CLOCKS_PER_SEC;
printf("Result : %i \n", counter);
printf("Done in %f second(s)\n", elapsed);
return 0;
}
อันนี้เราจะลองรันในเครื่องเดียวกันเลยนะว่า มันจะออกมาเป็นอย่างไร จากการทดลองนี้ ทำให้เราพิสูจน์ได้หลายเรื่องเลย ตั้งแต่สมมุติฐานที่ว่า Python ช้ากว่า C จริงมั้ย อันนี้เราก็เอา CPython เทียบกับ C เพียว ๆ เลย ดูว่าจะเป็นอย่างไร และ PyPy จะชนะ C ได้มั้ย เป็นอีกการทดลองนึงไป
เรื่องแรกจากกราฟนี้ ไม่ใช่เรื่องแปลกเท่าไหร่คือ CPython ใช้เวลาไปที่ 103.4998043 วินาที แต่เมื่อเราเอา Code เดิมรันด้วย PyPy จะใช้เวลาแค่ 1.035210133 วินาทีเท่านั้น หรือเกือบ ๆ 100 เท่าไปเลย ถือว่าโหดมาก ๆ เลยทีเดียว ส่วนเมื่อเราเทียบกับภาษา C ที่ใช้เวลาอยู่ที่ 1.266647 วินาที ซึ่งช้ากว่า PyPy เล็กน้อยคือ 0.231436867 วินาที ก็คือไม่ถึงวินาทีเท่านั้น ถือว่าโหดมาก ๆ เลยทีเดียว
จากการทดลองเราจะเห็นได้เลยว่า การใช้ PyPy ในการรัน Python ทำให้การทำงานเร็วขึ้นอย่างเห็นได้ชัดมาก ๆ เร็วกว่า C ในการทดลองซะอีก ซึ่งแน่นอนว่า มันยังสามารถใช้งานกับ Library ยอดนิยมได้หลาย ๆ ตัวเลย เท่าที่รู้มาก็คือ Django และ Numpy สามารถใช้งานได้อย่างไม่มีปัญหาเลย แนะนำให้ไปลองเล่นกันดู แล้วจะรู้ว่า ความเร็วเป็นเรื่องของปีศาจ
| Like | Comment | Share | >> STACKPYTHON
กิจกรรมที่กำลังจะมาถึง
ไม่พลาดกิจกรรมเด็ด ๆ ที่น่าสนใจ
Event นี้จะเริ่มขึ้นใน April 25, 2023
รายละเอียดเพิ่มเติม/สมัครเข้าร่วมคอร์สเรียนไพธอนออนไลน์ที่เราได้รวบรวมและได้ย่อยจากประสบการณ์จริงและเพื่อย่นระยะเวลาในการเรียนรู้ ลองผิด ลองถูกด้วยตัวเองมาให้แล้ว เพราะเวลามีค่าเป็นอย่างยิ่ง พร้อมด้วยการซัพพอร์ตอย่างดี