ก้าวแรก HPC #01 : Python

เกริ่นนำ

ก็อย่างที่กล่าวเอาไว้ในบทความก่อนหน้าว่าเราเน้นกันที่การเขียนโปรแกรม จะเขียนโปรแกรมก็ต้องเลือกภาษา ภาษาก็มีมากมายนับพันภาษา เป็นที่หนักใจสำหรับผมไม่น้อยที่จะคัดออกมาสองสามภาษาเพื่อเอามาใช้งาน ผมนั่งคิดนอนคิดอยู่นานทั้งวิเคราะห์และวิจัย เลยได้ข้อสรุปส่วนตัวมาว่า ภาษาแรกที่เหมาะกับงานทางวิทยาศาสตร์ ซึ่งเป็นแกนหลักของเว็ปนี้คือ Python ถ้าท่านไม่เคยใช้งาน Python ผมว่าคุ้มนะครับที่จะหยิบ Python ใส่ไว้ในกระเป๋าแห่งความรู้ของท่าน แต่ถ้าท่านยังลังเล ลองอ่านบทความนี้ดูก่อน แล้วค่อยสรุปอีกทีว่าดีพอหรือไม่

Python : ที่มาที่ไป

ภาษา Python จัดอยู่ในหมวดภาษาทั่วไป ใช้ได้หลายวัตถุประสงค์ รองรับการเขียนโปรแกรมแบบ Imperative, Functional และ Object-Oriented ภาษานี้เกิดขึ้นมานานมากแล้วครับ ตั้งแต่ปี 1991  โดย Guido van Rossum  ปัจจุบันภาษานี้อยู่ภายใต้การดูแลของ Python Software Foundation (PSF) โดยที่ van Rossum เป็นประธาน ภาษา Python นั้นออกมาแล้วสามรุ่นหลัก Python1 เก่าแล้วก็ไม่น่าสนใจ Python2 สิครับยอดนิยม รุ่นล่าสุดคือ Python 2.7 เชื่อว่าคงไม่มีรุ่นใหม่ไปกว่านี้แล้วครับ เนื่องจากเมื่อปลายปี 2008 PSF ประกาศตัว Python3 เพื่อทดแทน Python2 แล้ว ถ้าพูดถึงโครงสร้างของภาษาก็ต่างกันไม่มากนัก โปรแกรมที่เขียนด้วย Python2 อาจทำงานกับ Interpreterของ Python3 ไม่ได้ และเป็นจริงในทางกลับกันด้วยครับ แต่ก็เป็นไปได้ที่เขียนโปรแกรมที่ยืดหยุ่นพอที่จะทำงานได้ทั้งสองรุ่นโดยไม่ต้องแก้อะไร  Library ต่างๆ ก็เช่นกันครับ มีการ port จาก Python2 ให้กลายเป็น Python3 แต่หนทางยังอีกไกลครับ  ดังนั้นใครใช้ Python2 จะได้เปรียบตรงที่มี Library ให้ใช้งานมากกกว่า แต่สำหรับเว็ปนี้ เท่าที่สำรวจพบว่า Libary ที่ผมจำเป็นต้องใช้ในเว็ปนี้ รองรับ Python3 แล้วเกือบหมด ดังนั้นผมจะใช้ Python3 เป็นหลัก แต่ก็บ้างที่จำเป็นต้องใช้ Python2 ดังนั้นผมจะนำเสนอวิธีการที่ใช้งาน Python3 และ Python2 ในเครื่องเดียวกัน

 

Lightweight vs Heavyweight

หลายสิบปีที่ผ่านมา เราคุ้นชินกับกับเขียนโปรแกรม ที่ต้องวางโครงใหญ่ ด้วยมนตราแห่งคำว่า Object-Oriented มองโลกทั้งใบให้กลายเป็นวัตถุธาตุ เฉกเช่นขุนค้อนมองทุกสิ่งเป็นตะปู  ถ้ามีโจทย์ให้เขียนโปรแกรมบวกเลขหนึ่งถึงร้อย ถ้าเป็นภาษาเชิงวัตถุส่วนมาก เราก็ต้องเริ่มไหว้ครูโดยการสร้าง Class ก่อน จากนั้นก็เริ่มรำมวย public….  static …. void … main… แล้วค่อยลงเนื้อหา ใช้ลีลาสิ้นเปลือกมากมายกว่าจะเขียนเสร็จ ยังทำงานไม่ได้นะครับ ต้องเอามา compile ก่อน เขียนผิดก็แก้อีก แล้วค่อย compile ใหม่ เครื่องหมาย () {}  มักจะขาดๆ เกินๆ อยู่เสมอ

แต่พอมาเป็น Python เราก็แค่เข้าไปใน Python Shell แล้วพิมพ์   sum(range(1, 101))  ดังนี้ครับ

python_sum

การที่ทำเช่นนี้ได้ต้องอาศัยเทคโนโลยีหลายอย่าง เริ่มจากการเขียนแล้วทำงานได้โดยไม่ต้องคอมไพล์ทั้งโปรแกรม ซึ่งเรารู้จักกันดีว่ามันคือแนวคิดของ Interpreter ซึ่งมีข้อเสียอย่างที่คนทั่วไปรับทราบก็คือ มันทำงานช้ากว่าการ Compile มากครับ เรียกได้ว่าในเชิงประสิทธิภาพแล้วคนละเกรดกันเลยทีเดียว แต่ในเลวมีดีครับ ข้อดีของ Interpreter มีหลายข้อครับ ข้อแรกคือทำงานได้เลยไม่ต้องรอคอมไพล์ ทำให้การพัฒนา Software เร็วขึ้นอย่างมาก ข้อที่สองคือ ภาษาสามารถออกแบบให้ซับซ้อนขึ้นได้ เนื่องจากไม่ถูกจำกัดในการแปลเป็นภาษาเครื่อง ทำให้ภาษาที่ใช้แนวทางของ Interpreter นั้นมี “ลูกเล่น” หลากหลายที่ภาษาคอมไพล์ทำไม่ได้ และข้อที่สาม นับได้ว่าเป็นจุดเด่นอย่างยิ่งเลยทีเดียวคือ โปรแกรมมีความ Portable สามารถทำงานข้ามเครื่องได้โดยที่ไม่ต้องแก้โปรแกรม อย่างเช่น Python นั้นทำงานได้ ทั้งบนเครื่อง PC หลากหลาย OS ไปจนกระทั่งถึงโทรศัพท์มือถือ

Read-Eval-Print Loop (REPL) คือเทคโนโลยีอีกอย่างที่เสริมเข้ามา พูดง่ายๆ ก็คือ Shell นั่นเอง เมื่อพิมพ์คำสั่งการทำงานเข้าไป กด Enter Shell จะอ่านสิ่งที่เราพิมพ์เข้าไป แปล สั่งทำงาน แสดงผล แล้ววนกลับไปรอรับคำสั่งอีก ทำให้เราสามารถสั่งงานได้ทันที โดยไม่ต้องเขียนโปรแกรมเต็มรูป เช่นสั่งให้ดึงข้อมูลจากฐานข้อมูลออกมาประมวลผล โดยไม่ต้องเขียนโปรแกรมเต็มรูป หรืออยากทดสอบว่าคำสั่งนี้ใช้งานอย่างไรกันแน่ ก็สามารถไปทดสอบใน REPL ได้อย่างรวดเร็วเป็นต้น ตัวอย่างข้างบนที่ยกมาก็เป็น REPL ครับ

บางท่านที่อ่านมาถึงจุดนี้ อาจจะแย้งผมดังๆ ว่า ที่พูดมาเหมือนของเด็กเล่น โปรแกรม “ของจริง” อย่างระบบบัญชี จะมาเขียนแบบนี้ไม่ได้ เรื่องนี้ผมเห็นด้วยครับ ว่าท้ายที่สุดแล้วมันต้องเต็มรูป แต่ผมไม่เห็นด้วยในระหว่างทางครับ ด้วยภาษา Python นี้ เราสามารถเริ่มง่ายๆ อย่างนี้ก่อน แล้วค่อยๆ ปรับให้มันเป็นโครงสร้างสมบูรณ์ได้ครับ ไม่ใช้ต้องออกแบบเโครงสร้างรองรับเต็มรูป การค่อยๆ ขยายในลักษณะดังกล่าวได้รับการพิสูจน์มามากแล้วครับว่ามี Productivity สูงมาก

แนวคิด Lightweight แบบนี้เป็นที่นิยมมากครับ ทำให้การเรียนรู้ภาษาอย่างเช่น Python นั้นสามารถเรียนรู้ได้อย่างรวดเร็วมาก เราคำนึงถึงเนื้อหาที่เราจะเขียนมากกว่าวนเวียนอยู่กับภาค Syntax ของภาษา ว่ากันว่าในมหาวิทยาลัยชั้นนำของทั่วโลกเริ่มเปลี่ยนมาสอน Python เป็นภาษาแรกแทนภาษา Java (และน่าจะแซงไปแล้วด้วยครับ)  เท่าที่ผมสังเกต พบว่าระยะหลัง Java แผ่วลงไปมาก (ยกเว้นในโลกของ Android) ตั้งแต่ Oracle มากุมบังเหียน ความมั่นใจในความเป็นระบบเปิดและอิสระต่อธุรกิจ ก็เริ่มเลือนหายไป เชื่อว่า Python ได้รับอนิสงส์นี้เสียบแทน Java ในวงการการศึกษาของโลก

Productivity คุณค่าที่คุณคู่ควร

ข้างต้นผมได้กล่าวถึง Productivity บางท่านยังอาจสงสัย ว่าผมหมายถึงอะไรกันแน่ ผมก็เลยขอขยายความเสียหน่อย แปลเอาความหมายก็จะตรงกับคำว่า “ได้งาน” เราดูกันที่ผลลัพธ์ครับ ท่าอาจจะไม่สวย (ในสายตาบางท่าน) แต่ก็ไปถึงฝั่งฝันอย่างรวดเร็วครับ  ลองเปรียบเทียบกับภาษา C ดูครับ สมมุติว่ามีเด็กนักเรียนสองคนโคลนนิ่งกันมาเลย หน้าตา สมอง ความฉลาดเท่ากันทุกอย่าง จับคนหนึ่งไปเรียนภาษา C ครึ่งปี กับอีกคนเรียน Python ครึ่งปี แล้วให้มาทำโจทย์ เชื่อว่า คนเขียน Python จะเขียนเสร็จเร็วกว่ามาก เวลาที่ใช้ในการเขียนโปรแกรมอาจจะต่างกันไม่มากนัก แต่เวลาที่เสียไปสำหรับคนเขียนภาษา C คือการหาบั๊กครับ อาจจะเสียไปถึงครึ่งหนึ่งของเวลารวมทั้งหมด  นี่แหละครับนิยมคือคำว่า “ได้งาน” ของผม  ที่ภาษา Python เป็นที่ยอมรับกันทั่วไปครับว่า มี Productivity สูงมากนั่นก็เพราะ เขียนสั้น อ่านง่าย แก้ง่าย ไม่หมกเม็ด

Prototype Language

มีแนวคิดในการพัฒนา Software หลายแนวคิดที่ใช้หลักการสองภาษาครับ กล่าวคือเขาจะสร้างงานมาก่อนโดยใช้ภาษาหนึ่ง แต่ภาษานั้นไม่ใช่ภาษาที่ใช้งานจริงนะครับ เป็นภาษาที่เป็น Prototype ซึ่งใช้เขียนเพื่อ “proof of concept” คือลองดูว่ามันทำงานได้รึเปล่า เมื่อทำงานได้ถูกต้องแล้ว ก็จะใช้ภาษาที่ใช้เป็นหลักครับเขียนขึ้นมาใหม่โดยเอาแนวทางมาจากโปรแกรมเดิม ทำไมเขาถึงทำอะไรดูยุ่งยากอย่างนั้น จริงๆ แล้วไม่ได้ยุ่งยากครับ ส่วนมากงานแบบนี้เป็นงานที่ต้องการความเร็วในการประมวลผลสูงครับ  การใช้แนวคิดสองภาษาจึงเป็นการบังคับไปในตัวว่าต้องเขียนใหม่ และต้องเขียนให้มีประสิทธิภาพสูง การเขียนโดยใช้ภาษาเดียวนั้น โปรแกรมเมอร์อาจจะ “ขี้เกียจ” ปรับโปรแกรมเมื่อเขียนเสร็จ แต่ถ้าใช้สองภาษามันบังคับไปในตัวว่าต้องเขียนใหม่ เขียนให้ดี ให้เร็ว ภาษาที่เหมาะเป็นภาษาแรก หรือภาษา Prototype หนึ่งในนั้นคือภาษา Python นี่เองครับ ก็เขียนง่าย เสร็จเร็ว ไม่ต้องออกแรงเยอะ

ครบทุกสิ่งที่เลือกสรร

ถ้าท่านผู้อ่านนึกถึงงาน Application แปลกๆ ที่ทันสมัยล่าสุด หรือไม่ว่าท่านจะอยู่ในวงการที่มีการเขียนโปรแกรมลักษณะไดก็ตาม มักจะเห็นว่ามี Python แหย่ขาเอาไว้เสมอ แม้แต่เขียนโปรแกรมแบบ Embedded ขนาดเล็กอย่าง Raspberry Pi ไปค้นดูก็จะเห็น มีชื่อหนังสือ Raspberry Pi คู่กับ Python อยู่หลายเล่ม ไปจนถึงใช้งาน Big Data ที่ยอดนิยม ที่ใช้กำลังเครื่องคอมพิวเตอร์มหาศาล ก็สามารถเขียนโดยใช้ Python ได้อีก ไม่ว่าสายงานไหนที่มีการใช้งานภาษาคอมพิวเตอร์ ก็มักจะมี Python อยู่นั่นด้วย ผลลัพธ์ออกมาในรูปแบบ Library หรือ Framework ไปลองดูครับ มีเยอะมาก และส่วนมากก็มีประสิทธิภาพที่ค่อนข้างจะดี  โดยเฉพาะอย่างยิ่งงานคำนวณทางวิทยาศาสตร์ ดังที่ผมจะกล่าวต่อไป ทั้งนี้ในตัวของ Python เองก็มี Library ขนาดใหญ่ที่ครบเครื่องแถมให้มาด้วย ดังที่ฝรั่งใช้คำว่า “Battery Included” ซึ่งหมายความว่า install เสร็จก็เริ่มใช้งานได้เลยไม่ต้องเสียว่าไป install โน้นนี่นั่นเพิ่มเติมให้เสียเวลา เปรียบเสมือนเครื่องใช้ไฟฟ้าที่เราซื้อมาให้ถ่านมาด้วย ใส่ถ่านแล้วใช้ได้เลย ไม่ต้องไปหาถ่านที่ไหนอีก

 

งานคำนวณทางวิทยาศาสตร์

เว็ปนี้ออกตัวชัดเจนครับว่าเป็นงานคำนวณทางวิทยาศาสตร์ประสิทธิภาพสูง ดังนั้นภาษาที่ผมเลือกต้องเหมาะกับงานนี้ ทำไม Python ถึงเหมาะ ถ้าคุยกันเรื่องนี้จริงๆ คงต้องย้อนความกับไปตั้งแต่กำเนิดภาษาคอมพิวเตอร์ระดับสูงกันเลย ก็อย่างที่ผมเคยบอกไปครับว่า ภาษาคอมพิวเตอร์ระดับสูงภาษาแรกคือ FORTRAN ออกแบบมาเพื่อคำนวณงานทางวิทยาศาสตร์โดยเฉพาะ ดังนั้นจึงมีการปรับแต่งเพื่อให้เหมาะกับการคำนวณ อย่าดูถูกไปนะครับ FORTRAN ว่าเก่าแก่โบราณนะครับ เชื่อไหมว่าทุกวันนี้ ถ้าเป็นงานทางการคำนวณล้วนๆ ภาษา C ที่ได้ชื่อว่าเร็วมาก ก็ยังเอาชนะ FORTRAN ไม่ได้เลย มันเกิดมาเพื่อคำนวณจริงๆ  แต่ภาษา FORTRAN นอกเสียจากการคำนวณแล้วอย่างอื่นไม่ทำได้ไม่ดีนัก วงการวิทยาศาสตร์บางส่วนจึงย้ายฐานมาภาษาตระกูล C อย่างเช่น C และ C++  และย้ายมาสู่ Java และ MATLAB ในที่สุด เพราะจุดเด่นอยู่ที่ความครบเครื่องและความ Portable ครับ เนื่องจาก Java ในยุคหลังๆ ก็แผ่วลงไปดังเหตุผลที่ผมกล่าวมาแล้ว ผมก็ขอคุยถึง MATLAB เสียหน่อย เผื่อใครยังไม่รู้จัก

MATLAB นั้นเกิดมาในยุคปลาย 1970 ใกล้เคียงกับ C++ ตัว MATLAB เกิดขึ้นมาครั้งแรกเป็นโปรแกรม ยังไม่เป็นภาษาเต็มรูปโดยอาจารย์มหาวิทยาลัยทางคอมพิวเตอร์ท่านหนึ่งครับ Cleve Moler ซึ่งในเวลานั้นมีการสอนการประมวลผล Matrix โดยการใช้คอมพิวเตอร์ การคำนวณ Matrix ที่ซับซ้อน สมัยนั้นก็ต้องเขียนด้วยภาษา FORTRAN  เป็นหลัก ซึ่งเด็กนักศึกษาก็เขียนได้ไม่ค่อยคล่องนัก ทำให้การเรียนการสอนสะดุด ดังนั้นอาจารย์ท่านนี้จึงออกแบบโปรแกรมขึ้นมาตัวหนึ่งเป็นแบบ REPL  ลองดูตัวอย่างนี้ครับ

transpose

โปรแกรมนี้สร้าง Matrix ขนาด 3×3 แล้วจับตีลังกาตามหลักของ Matrix หรือที่เรียกกันว่า Transpose นั่นเอง จะเห็นได้ว่าด้วย MATLAB เราไม่จำเป็นต้องเขียนโปรแกรมเที่ยุ่งยาก วนรอบเพื่อประมวลผล Matrix ดังนั้นโปรแกรมนี้จึงได้ชื่อว่า MATrix LABoratory หรือ MATLAB นั่นเอง จากนั้นจึงมาการพัฒนามาเป็นโปรแกรมทางการค้า อย่าทำเป็นเล่นไปนะครับราคาหลักแสน ในเมืองไทยเรานี้มีการใช้งานกันอย่างกว้างขวางมากครับโดยเฉพาะอย่างยิ่งวิศวกรรมแขนงต่างๆ แต่เชื่อไหมครับว่ายอดขายของเมืองไทยมีนิดเดียว แล้วที่เหลือหละ ไม่บอกก็เข้าใจกันนะครับ

MATLAB ในยุคปัจจุบันมีจุดเด่นอะไร ทำไมถึงนิยมกันนัก ข้อแรกเลยคือมี Library ระดับลึกซึ้งสำหรับวิศวกรรมแขนงต่างๆ เด่นมาก ถ้าไปใช้เครื่องมือตัวอื่น อาจจะติดขัด ไม่มีให้ใช้ ทำให้อาจต้องเขียนเอง ยากมาก MATLAB มีให้พร้อม ทำให้ทุกวันนี้ก็ยังคงเป็น King ในวงการอยู่ครับ ข้อที่สองคือ มีการสร้างภาษาคอมพิวเตอร์ขึ้นมาใหม่ชื่อเดียวกันกับตัวโปรแกรมนั่นคือ MATLAB นั่นเอง ซึ่งภาษานี้ประสิทธิภาพสูง มีโครงสร้างครบ รองรับ Object-Oriented และยังคงการทำงานระดับ Matrix ได้โดยสมบูรณ์ และข้อที่ 3 ซึ่งนับได้ว่าเด่นไม่แพ้กันคือ Graph ครับ ซึ่งสามารถแสดง Graph สองมิติ สามมิติ ระดับมืออาชีพ รวมถึงการประมวลผลภาพ เป็นตัวแม่ตัวหนึ่งในวงการนี้เลยครับ ยากที่ใครจะเอาชนะได้

อย่างที่กล่าวไว้แล้วนะครับ ในโลกของ OpenSource และของฟรีสนับสนุน Python ให้เป็นหลักในการสู้ศึกแทน Java ด้วยจุดเด่นของของภาษาที่เด่นมาก Productivity สูงเยี่ยมเทียมเมฆ ภาษาดีก็มีชัยไปกว่าครึ่ง ถ้าอยากจัดการ Matrix โดยไม่ต้องเขียน for loop เอง ก็ทำได้ดังนี้ครับ

transpose_python

 

แม้ว่าจะดูไม่เนียนตาเหมือนกับ MATLAB แต่ก็ถือว่าสูสีครับ ขึ้นชกรุ่นเดียวกันได้  ถ้า a.transpose() ดูยุ่งไปนิด  a.T เป็นยังไงครับ น่าจะทำให้ง่ายขึ้น เรื่องโครงสร้างทางภาษาโดยรวมนี่หายห่วงครับ ชนะ MATLAB ได้อย่างสบายครับ ส่วนเรื่องของ Graph  Python นั้นมีคนสร้าง library ชื่อ matplotlib ขึ้นมา แค่ชื่อก็บ่งชี้แล้วครับ mat มาจากคำว่า MATLAB นั่นเอง คือสร้าง Library เลียนแบบ MATLAB เลย ผมขอออกตัวเลยว่ายังไม่ได้ใช้ matplotlib อย่างจริงจังเท่าใดนัก เลยไม่กล้าจะฟันธงว่า ถ้าเทียบกับ MATLAB แล้วจะเป็นอย่างไร แต่เท่าที่อ่านผ่านตาใน Internet เขาก็ว่ากันว่าสูสีนะครับ เรามารู้พร้อมกันในบทความต่อๆ ไปดีกว่าครับ ผมจะลองให้มันสร้าง Graph ที่ซับซ้อนแล้วค่อยมาประเมินอีกทีว่าจะเป็นอย่างไร แต่ในตอนนี้เรากลับมาเรื่องของเราก่อนครับ จะเห็นได้ว่า อยากได้อะไร Python ก็มีให้ อย่าง matplotlib ก็ยังมีเลย ส่วน Library ที่เป็นจุดขายของ MATLAB  วันนี้ผมเชื่อว่า Python ยังสู้ไม่ได้ครับ แต่ในอนาคตอันไม่ไกลก็ไม่แน่นะครับ พลังแห่ง OpenSource ที่ทั้งโลกช่วยกันทำอาจจะเอาชนะ MATLAB ก็เป็นไปได้ครับ

มาดูจุดแข็งที่ Python มีเหนือ MATLAB จะดีกว่าครับ กล่าวคือ Python นั้นไม่ได้รองรับงานทางวิศวกรรมศาสตร์อย่างเดียวแต่หากสาขาอื่นด้วย ดูง่ายๆ ที่ MATLAB ครับ ตัวแปรพื้นฐานของ MATLAB จะมีชนิดเป็นจำนวนเชิงซ้อนครับ โดยที่ทั้งส่วนจริงและส่วนจินตภาพเป็น floating point ทั้งคู่  ถ้าท่านไม่รู้จักจำนวนเชิงซ้อนก็ไม่ต้องตกใจครับ มองว่า MATLAB ชนิดพื้นฐานเป็นชนิด double เหมือนภาษา C ไปก็ไม่ผิดนัก แต่สำหรับ Python แล้ว มีทั้ง double และมี Integer ซึ่ง Integer นับเป็นจุดเด่นครับ คือมีจำนวนหลักได้ไม่จำกัด ไม่เหมือนภาษา C ที่ ตัวเลขอย่างเช่น int อาจจำกัดค่าแค่ประมาณ 2000 ล้าน ถ้าเกินกว่านั้นวนกลับ แต่ Python ไปยาวเลยครับ ดังนั้น Python จึงเหมาะกับงานคำนวณในเชิง Number Theory และการเข้ารหัสครับ แถมยังมีชนิดตัวแปร เศษส่วน และยังสามารถคำนวณแบบ Symbolic ดังตัวอย่างข้างล่างครับ

sympy_expand

 

ขอให้ความเป็นธรรม MATLAB สักหน่อย คือทุกสิ่งที่เพิ่งกล่าวมา ใน MATLAB มีหมด แต่ไม่ได้มีในตัว MATLAB เองนะครับ คือ MATLAB ไปซื้อ MuPAD ซึ่งเป็นโปรแกรมแนวเดียวกันกับ Mathematica กับ Maple จากเยอรมัน ว่าไปแล้วก็เป็นโปรแกรมเกรด A- น้องๆ สองโปรแกรมที่กล่าวมาครับ เอามาบรรจุอยู่ใน MATLAB เป็นส่วนเสริมที่ซื้อเพิ่มได้ เราสามารถเขียนโปรแกรมเชื่อมต่อระหว่าง MATLAB และ MuPAD ได้โดยไม่ยากครับ แต่ก็ต้องเสียเงินเพิ่ม  เทียบกับคำว่าฟรีแล้ว Python ทำให้ Python หล่อขึ้นมามากเลยทีเดียว

ย้อนกลับมาถึงเรื่องความเหมาะสมสำหรับงานคำนวณทางวิทยาศาสตร์ อีกประเด็นหนึ่งก็คือ ภาษาที่สามารถทำ Operator Overload จะได้เปรียบมาก Operator Overload คือความสามารถในการนิยามเครื่องหมายต่างๆ เช่นบวกลบคุณหารให้แก่ชนิดตัวแปรที่เราสร้างใหม่ ซึ่งถ้าภาษาใดทำไม่ได้ ก็ต้องใช้เป็น method เช่น .add(a, b)  แทนที่จะเขียน a + b และยิ่งการคำนวณยิ่งซับซ้อนก็ยิ่งเขียนยุ่งยาก ที่พูดมาทั้งหมด ก็เพียงจะบอกว่า Python และ MATLAB ทำ Operator Overload ได้ครับ ดังนั้นถ้าจะเลือกภาษาที่ใช้ในงานคำนวณซับซ้อน เรื่องนี้ไม่ควรมองข้ามครับ

Interpreter Python 3 สายพันธุ์

Interpreter Python ที่เราใช้งานเป็นหลักนั้น สร้างขึ้นมาจากภาษา C  ดังนั้นบางทีเราก็เรียกว่า CPython ซึ่งเป็น Interpreter ที่ได้รับความนิยมสูงที่สุด น่าจะเกิน 90% จุดเด่นของ CPython คือสามารถเรียกใช้ฟังก์ชันที่เขียนโดยใช้ภาษา C ได้ ซึ่งแน่นนอนครับ แถมยังสามารถแปลฟังก์ชันของ Python ให้กลายเป็นภาษา C ได้อีกต่างหาก ซึ่งรู้ๆ กันว่าฟังก์ชันภาษา C ทำงานเร็วกว่าฟังก์ชันชอง Python มาก จึงเป็นวิธีหนึ่งในการเร่งประสิทธิภาพของ Python ได้เป็นอย่างดี เอาไว้เดี๋ยวผมจะเขียนบทความบทหนึ่งเฉพาะเรื่องการเร่งความเร็วของ Python เลย

แต่ยังครับโปรโมชันของ Python ยังไม่หมด เมื่อปี 2001 นั้น มีคนกลุ่มหนึ่งเกิดแหวกแนวอยากเอา Python ขึ้นไปทำงานบน JVM ผลลัพธ์คือ jython ซึ่ง Library ของ Python ทั้งหมดเมื่อเรียกใช้ ก็ไปเรียกต่อ Library ของ JVM อีกที ซึ่ง Sun เห็นโปรเจคนี้น่าสนใจ เป็นการเพิ่มทางเลือกให้ผู้ไม่อยากใช้ Java สามารถใช้ Python เพื่อทำงานบน JVM ได้ แม้ว่า Sun จากเราไปแล้ว แต่ Jython ยังอยู่ครับ ท่านอาจจะสงสัยว่า แล้วมันจะทำไปทำไมกัน มีอะไรดีกว่า CPython  ถ้าพิจารณาเรื่องความเร็ว ก็ไม่ชัดเจนนักครับว่าเร็วกว่า แต่ที่ชัดเจนก็คือ สามารถเรียกใช้ Library ของ JVM ได้ตรง นับได้ว่าเด่นมาก ลองดูตัวอย่างครับ

ใครคุ้นกับภาษา Java ก็จะคุ้นเคยดีครับ ว่า println() เป็น method ของ Java ซึ่งเราเอามาใช้ใน Python ได้เลย ดังนั้นถ้าใช้ Cython ก็สามารถใช้ Python + C  ถ้าใช้ Jython ก็สามารถใช้ Python + Java Classes  และยังสามารถคอมไพล์เป็น .class ได้อีกต่างหาก ยังครับยังมีอีกหนึ่งสายพันธุ์ที่เหลือ ชื่อว่า IronPython ซึ่งก็คือ Python บน .NET ดังนั้น จึงเป็น Python + .NET Classes  ถ้าเบื่อเขียน C# หรือ VB.NET ก็ลองเขียน ASP.NET โดยใช้ Python ก็ได้ครับ

แต่ก็ไม่ใช่ว่าทั้งสามสายพันธุ์จะทัดเทียมกันนะครับ CPython เป็น Interpreter ตัวเดียวที่รองรับ Python3  ส่วนอีกสองตัวรองรับเพียงแค่ Python2 นับเป็นเรื่องน่าเซ็งสุดๆ ครับ และยังไม่มีแผนที่จะทำครับ ก็คงต้องรออีกนาน ในเว็ปนี้ผมจะเน้นที่ CPython เป็นหลักนะครับ เพราะต้องการใช้ Python3 แต่อาจจะมี Jython หรือ IronPython แทรกเข้ามาเล็กๆ น้อยๆ ตามแต่โอกาสจะอำนวย

มีดีก็มีเลว

ในโลกนี้ไม่มีคำว่าดีที่สุดครับ ถ้ามี เราก็คงเห็นว่าบนท้องถนน คงเต็มไปด้วยรถยี่ห้อเดียวและรุ่นเดียวกันหมด ของดีก็มักจะแพง แต่แม้ว่าจะราคาเท่ากันก็ตาม คนยังชอบไม่เหมือนกันเลยครับ ต่างรุ่นต่างยี่ห้อ ภาษาคอมพิวเตอร์ก็เหมือนกัน ต่างจิตต่างใจครับ ในหัวข้อนี้ผมจะมาชี้ถึงจุดอ่อนของ Python สามข้อหลักในความคิดของผม จริงๆ แล้วข้อเสียมีมากกว่า 3 ข้อนี้มากครับ แต่ผมเลือกเอาเฉพาะที่กวนใจผมจริงๆ เท่านั้น ดังนี้ครับ

ข้อแรกที่สุดๆ จริงๆ คือความช้าของ Python ครับ แน่นอนครับในเมื่อ Python เป็นภาษาแบบ Interpreter มันก็ย่อมต้องช้า แต่ที่ทำใจลำบากก็คือ มันช้ากว่าเพื่อนๆ ที่เป็น Interpreter ด้วยกันค่อนข้างจะมาก ในบรรดาภาษา Interpreter ที่ยอดนิยมด้วยกัน Python เกือบรั้งท้าย ช้ากว่า Ruby ประมาณเท่าตัว เห็นแต่จะดีกว่าก็แค่ภาษา R เท่านั้น ทางออกก็พอมีครับ อาจจะเปลี่ยนเทคนิคในการเขียนทำให้เร็วขึ้นได้บ้าง หรืออาจจะแปล Python ให้กลายเป็น C และใช้ C compiler จะเร็วขึ้นมาก หรือแม้แต่การประมวลผลแบบขนาน เหล่านี้ล้วนแล้วแต่เร่งประสิทธิภาพขึ้นได้ เอาไว้ในบทต่อๆ ไปครับ จะค่อยๆ นำเสนอเรื่องราวเหล่านี้

ข้อต่อมาคือภาค syntax ครับ ภาษา Python ไม่ใช่เป็นแบบ Free Form เหมือนภาษา C จะเขียนอะไร เยื้องกันเว้นบรรทัด เขียนติดกันอย่างไรก็ได้ ภาษา Python ทำอย่างนั้นไม่ได้ครับ  Python ใช้การเยื้องแทนความเป็นส่วนย่อย เช่น ถ้าคำสั่งอยู่ใน for คำสั่งนั้นก็ต้องเยื้องเข้าไปทางขวาของ for และต้องเยื้องให้เท่ากันในทุกๆ คำสั่งที่ระดับเท่ากัน ซึ่งบอกตรงๆ ครับ ผมทำใจอยู่หลายปีเลย ที่จะยอมรับการเขียนโดยใช้ลักษณะนี้ ก็มันติดแนว C กับ Ruby ไปแล้วครับ แต่อย่างอื่นของ Python มันก็เกินห้ามใจ ก็เลยท้ายที่สุดก็ต้องยอมมัน ใช้มาเรื่อยๆ จนตอนนี้ชินแล้วครับ กลับคิดว่าดีเสียอีก เขียนแบบนี้กระทัดรัดกว่า C อีก แถมยังลดโอกาสทำให้ผิดพลาดลงได้มาก

ข้อที่สามสุดท้าย ภาษา Python นั้นได้ชื่อว่าเป็นภาษาที่มี online Help แย่ที่สุดภาษาหนึ่ง ถ้าท่านใช้ IDE แล้วคิดขัดการใช้งานคำสั่งใดคำสั่งหนึ่ง คิดว่าจะพึ่ง Online Help ท่านคิดผิดครับ หาอะไรแทบไม่เจอเลยครับ ได้แต่พื้นๆ ไม่ว่าจะใช้ IDE ตัวใดก็ตาม ดังนั้นท่านที่เขียน Python เป็นหลักคงทำเหมือนผมครับ ติดอะไร ก็อากู๋จะง่ายกว่า ซึ่งก็ถือว่าเป็นทางออกทางหนึ่ง เช่นเดิมครับ แม้ท่าจะไม่สวย แต่พอบินถึงฝั่งฝันได้ครับ

การติดตั้ง Python

Python สามารถใช้งานได้บน OS หลักๆ ได้ทั้งหมดครับ ซึ่งผมจะไม่ผูกติดกับ OS เพียงตัวเดียว ในที่นี้ผมจะใช้ทั้ง Windows และ Linux (Ubuntu) ซึ่ง Python เองก็คล้ายๆ Linux ครับ คือมี Package มากมาย เราสามารถเข้าไปที่ http://www.python.org เพื่อ Download และ Install ซึ่งผมคงไม่ใช้วิธีนี้ครับ เพราะ package บางตัวติดตั้งยากพอสมควร เราไม่ควรที่เข้าไปยุ่ง เอาที่สำเร็จมาใช้น่าจะดีกว่า คนรวบรวม Package ก็มีหลายกลุ่มครับ แต่ที่ผมเลือกมาให้ท่านผู้อ่านลง คัดมาแล้วครับว่าน่าจะเหมาะที่สุดชื่อว่า Anaconda ของบริษัท Continuum Analytics  ซึ่ง Package ที่เขาเอามาจากคนอื่น ก็มันรวมแจกฟรี แต่บางตัวที่เขาคิดขึ้นมาเอง ก็ฟรีบ้างจ่ายเงินบ้าง เราก็คงยึดติดเฉพาะของฟรีครับ  ท่านสามารถเลือกได้สองแบบครับคือ Anaconda หรือ miniconda  ซึ่งต่างกันตรงที่ Anaconda จะรวมฮิตลูกทุ่งมาตรฐานมาให้เลย ตัวหลักๆ มีมาให้ครับ ลงเสร็จทีเดียวเกือบอิ่ม แต่ miniconda นั้นมีแต่ตัวเครื่องมือพื้นฐานครับ ถ้าอยากได้ตัวไหนก็เรียกคำสั่งติดตั้งมาได้เลยครับ แนะนำว่า ถ้าใครลงเครื่องคอมพิวเตอร์ให้เลือก Anaconda ครับ แต่ถ้าลง embedded อย่างพวก Raspberry Pi ก็เลือก miniconda แล้วไปเลือก package เองจะดีกว่า

พร้อมแล้วไปเลยครับ ที่  http://www.continuum.io/ ไปที่ Products->Anaconda แล้วกด Download เลยครับ  ให้เลือก Version 3.x  นะครับ อย่าเลือก 2 แฟ้มน่าจะประมาณ 300mb ครับ เมื่อลงเสร็จแล้ว ก็พิมพ์ตามดังนี้ครับ

คำสั่ง conda เป็นคำสั่งที่เป็นแกนกลางของการจัดการ package ครับ ทั้งใน Anaconda และ miniconda จะมีทั้งคู่ บรรทัดแรก เป็นการปรับปรุงตัว conda เองให้เป็นรุ่นใหม่ล่าสุด  บรรทัดที่สองถ้าใคร install anaconda ก็ควรจะเรียกใช้เพื่อปรับปรุง package ทั้งหมดที่ลงของ anaconda ครับ ส่วนบรรทัดที่สามนี้เป็นการสร้าง virtual environment ของ python 2.7 ครับ บางครั้งเราจำเป็นต้องใช้ 2.7 ก็เลยลง Anaconda ของ 2.7 ซึ่งกินเวลาค่อนข้างมากครับ เพราะต้อง download 300mb ของ 2.7 มาทั้งหมด  ถ้า install ไม่สำเร็จเกิดหลุด ให้พิมพ์ conda install -n python2 anaconda เพื่อต่อนะครับ  จากนั้นเมื่อใดก็ตาที่พิมพ์ activate python2   เราจะกลายเป็น python 2.7 เมื่อปิด shell เปิดใหม่จะกลายเป็น 3.x ครับ  แต่ activate python2 เมื่อใดก็จะกลายเป็น python2.7 แบบนี้ทำให้เรามีสองรุ่นในเครื่องเดียวกันครับ

เมื่อลงเสร็จ ลองเข้า python ดูครับ สังเกต version ดูครับ ถ้าต้องการออก กด CTRL-D  ท่าน

ถ้าท่านใช้งาน Python อย่างจริงจัง แนะนำให้ใช้ ipython แทน python ครับ เพราะมีความสามารถสูงกว่า และมี 3 รุ่นคือ  console, qtconsole และ notebook   console นั้นก็ทำงานเป็น text mode ถ้าต้องแสดง graph จะไปแสดงอีกหน้าต่างหนึ่ง ส่วน qtconsole เป็น graphic console สามารถ แสดง graph ได้เลยในหน้าเดียวกัน ส่วน notebook เป็น Web interface ครับ น่าจะเป็นตัวที่ดูดีที่สุดแล้วครับ

และ IDE แนะนำ spyder ครับ ครบเครื่องและฟรีครับ มีตัวช่วยภายในเกี่ยวกับ Python พอสมควร

ก่อนจาก

ในบทนี้ผมก็ปูพื้นที่มาที่ไปทำไมถึงเลือก Python ตลอดจนการติดตั้งอย่างง่ายไปแล้วนะครับ แต่เว็ปนี้ไม่ใช่เว็ปสอนภาษา Python ถ้าใครอยากเรียก Python ผมแนะนำหนังสือเล่มหนึ่งครับชื่อว่า The Quick Python 2nd Edition สั้นๆ กระชับอ่านง่ายดีครับ ในบทความต่อไปจะกล่าวถึงอีกภาษาหนึ่งที่ผมเลือกใช้คือ C++ ครับ

 

[Total: 10    Average: 3.7/5]

You may also like...

2 Responses

  1. Sennin says:

    ขอบคุณมากครับ กำลังงงอยู่เลยว่า Anaconda เอาไว้ทำอะไรครับ

  2. Anno says:

    ขอบคุณครับ อ่านแล้วเพลินมาก + ได้ความรู้ด้วย ^^

Leave a Reply

Your email address will not be published. Required fields are marked *