Psyco ให้โปรแกรมที่เขียนด้วย python ทำงานเร็วขึ้น 2-100 เท่า โดยไม่ต้องแก้โค้ดเดิม

จากคอมเมนท์ข่าว กูเกิลเตรียมพัฒนา Python ขนานใหญ่ ใน blognone ทำให้ผมเพิ่งรู้ว่า java ทำงานได้เร็วกว่า python เพราะมี Java VM ที่เป็น Just-in-Time Compiler (JIT Compiler)

JIT Compiler ตามความเข้าใจของผม (งูๆปลาๆ)

ตามปกติ Java VM ทำหน้าที่เป็น Interpreter เวลาเรารันโปรแกรมก็จะแปลโค้ดทีละบรรทัดเป็นภาษาเครื่องที่สอดคล้องกัน และเมื่อเจอโค้ดเดิมๆ Interpreter ก็ต้องแปลโค้ดเดิมซ้ำทำให้เสียเวลา

JIT Compiler เข้ามาช่วยเพิ่มความเร็วได้ โดยมันจะคอย cache ส่วนของโค้ดที่เคยแปลเป็นภาษาเครื่องไว้ ทำให้เวลาเจอโค้ดเดิมก็สามารถเรียกภาษาเครื่องที่ cache ไว้พ่นใส่ CPU ได้ทันที

แล้ว Python มี JIT Compiler ไหม?


มีครับ ชื่อว่า Psyco (ไม่ได้สะกดผิดนะ) ได้รู้จักมันครั้งแรกจากคอมเมนท์ข่าวใน blognone อีกเช่นเคย คำอธิบายสั้นๆ เกี่ยวกับ Psyco:

มันคืออะไร: Python extension ที่ช่วยให้รันโปรแกรมเดิมที่เขียนด้วย Python ให้เร็วขึ้นโดยไม่ต้องแก้โค้ดเดิม
ประโยชน์: โปรแกรมรันเร็วขึ้น 2 เท่า ถึง 100 เท่า (โดยทั่วไปเร็วขึ้น 4 เท่า)
ข้อเสีย: Psyco ใช้หน่วยความจำเยอะ และรันบน Intel 386-compatible processor ภายใต้ระบบปฏิบัติการใดๆ (ในยุคข้าวยาก หมากแพง แต่แรมถูก จะใช้แรมมากๆ ก็คงไม่เป็นไรมั้งครับ :) )

ทดลองกันหน่อย

# โปรแกรมปกติ
import time
start = time.clock()
 
 
 
def fib(n):
    if n == 0 or n == 1: return 1
    return fib(n-1)+fib(n-2)
 
print "Fib 40 = ", fib(40)
 
end =  time.clock()
print "Duration: ", (end-start), " seconds"
 
# Output:
# 165580141
# Duration:  106.025350987  seconds
# ใช้ psyco
import time
start = time.clock()
import psyco          ### เพิ่มโค้ดบรรทัดนี้
psyco.full()            ### กับบรรทัดนี้
 
def fib(n):
    if n == 0 or n == 1: return 1
    return fib(n-1)+fib(n-2)
 
print "Fib 40 = ", fib(40)
 
end =  time.clock()
print "Duration: ", (end-start), " seconds"
 
# Output:
# 165580141
# Duration:  6.715894129  seconds

เฮือก… จาก 106.0 วินาที ลดเหลือ 6.7 วินาที! พอลองเอา Psyco ไปใช้กับโปรแกรมตัดคำไทย cpskCut ปรากฏว่าบนข้อมูลทดสอบ 5 แสนคำ จากเดิมใช้เวลา 78 วินาที ลดเหลือ 34 วินาที (โดยเพิ่มโค้ดแค่ 2 บรรทัดด้านบนครับ)

ใครอยากลองเอาไปใช้บ้างก็ ดาวน์โหลด Psyco สำหรับ Python 2.6 ได้ที่นี่ ครับ

Comments (7)

RTSPMarch 30th, 2009 at 2:44 am

เร็วขึ้นแบบเห็นได้ชัดเลย แต่เสียดายที่เราไม่ค่อยมีโปรแกรมใหญ่ๆเท่าไหร่

น่าเอาไปลองกับพวก web? ใช้ได้ปะวะ

ป.ล. ถ้าใช้กับ nontri login จะทำให้โหลด source page เร็วขึ้นบ้างมั้ย 5555555555555

b4lmungMarch 30th, 2009 at 10:55 pm

java ตอนนี้ที่เป็น jit รวมอยู่ใน JDK 6 แล้วคือ hotspot
แต่เท่าที่ลอง OpenJDK ของ java ที่เป็น opensource ทั้งหมด รู้สึกว่า IcedTea เร็วกว่า hotspot อยู่เหมือนกัน ไว้วันหลังลองรีวิวให้ดู เพียงแต่ OpenJDK มันไม่มี build บน windows ถ้าอยากใช้ต้อง build เอง

Conan_KungMarch 30th, 2009 at 11:08 pm

That’s so cool !! Wow!

Thank for this knowledge.

JojasMarch 31st, 2009 at 1:13 am

เห็นด้วยกับ RTSP ด้วยคับ
เอาไปใช้กับ Web ได้รึเปล่า
ผมกกำลังสนใจ :D

nattsterMarch 31st, 2009 at 5:32 pm

@RTSP @Jojas ถ้าเว็บมีการประมวลผลซ้ำๆ (มีลูปนานๆ) ก็น่าจะช่วยให้เร็วขึั้นได้ครับ
แต่ถ้าเว็บถูกเรียกขึ้นทำงานแว๊บนึง แล้วก็หยุด (อาจช้าลงเพราะเสียเวลา compile นานกว่า เวลาที่ใช้รันโปรแกรม)

แต่ python ธรรมดา ก็เร็วกว่า php มากอยู่แล้วนะครับ :)

OrpheousApril 1st, 2009 at 5:13 pm

มันยอดมากจอร์จ

[...] แนะนำให้ใช้ Python Psyco ละครับครับ Tags: optimizing, performance, python, speed Posted under: [...]

Leave a comment

Your comment