26 สิงหาคม 2560

Published สิงหาคม 26, 2560 by with 0 comment

เพิ่มความเร็วโค้ด Python โดยใช้ไฟล์ .pyx ของ Cython

สวัสดีผู้อ่านททุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปลองเขียนโค้ด Python ให้เร็วและมีประสิทธิภาพมากขึ้นโดยใช้ไฟล์ .pyx ของ Cython กันครับ


.pyx เป็นไฟล์โค้ดที่จะถูกคอมไพล์ไปเป็นภาษาซีโดย Cython

เราสามารถนำ .pyx มาช่วยเร่งความเร็วการทำงานของโค้ดได้ มีไฟล์ num.py เป็นโปรแกรมหาค่าการบวกของเลขเดียวกันบวกกันตามจำนวนครั้งที่กำหนด (ไม่ใช้การคูณ)



เราต้องการหา 20000 บวกกับ 20000 จำนวน 200000090 ครั้ง จึงรันโค้ดด้วยคำสั่งรันโค้ด Python แบบบรรทัดเดียวด้วยคำสั่ง
$ python -c "import num;print(num.plus(20000,200000090))"
4000001800000

แต่มันใช้เวลาทำงานนานมาก
$ time python -c "import num;print(num.plus(20000,200000090))"
4000001800000

real 0m17.937s
user 0m17.828s
sys 0m0.004s

มาทดลองใช้ .pyx ของ Cython

หากเราสร้างไฟล์ num.pyx ขึ้นมา โดยไฟล์ num.pyx มีโค้ดเหมือนกับ num.py ขึ้น โดยบันทึกไว้คนละโฟลเดอร์กับ num.py


แล้วรันด้วยคำสั่ง
$ time python -c "import pyximport; pyximport.install();import num;print(num.plus(20000,200000090))"
4000001800000

real 0m10.708s
user 0m10.692s
sys 0m0.012s

จะเห็นได้ว่า .pyx ของ Cython ช่วยเร่งความเร็วโค้ด Python ให้เร็วขึ้นกว่าเดิม โดย pyximport เป็นโมดูลส่วนหนึ่งของ Cython ที่ช่วยในการ import ไฟล์ .pyx มาใช้งานใน Python โดยมีข้อแม้คือ ต้องเป็นโมดูลหรือโค้ดที่ไม่ต้องการ C libraries หรือการติดตั้งแบบพิเศษ

ส่วนคำสั่ง pyximport.install() เป็นคำสั่งติดตั้งระบบ import ไฟล์ .pyx

หากผู้อ่านไม่ต้องการเปลี่ยนนามสกุลจากไฟล์ .py มาเป็น .pyx ก็สามารถใช้ pyximport  ช่วยเร่งความเร็วของโค้ดได้โดยวาง pyimport = True ใน pyximport.install() เพราะตั้งแต่ Cython 0.11 เป็นต้นมา pyximport รองรับการทำงานทั้งจากไฟล์ .py และ .pyx

ก่อนใช้งานต้องวางโค้ดก่อน import โมดูลเข้ามา
import pyximport
pyximport.install(pyimport = True)
import โมดูล

เพียงเท่านี้ความเร็วโค้ด Python ก็เร็วขึ้นแล้ว

นอกจากนั้น คุณสามารถนำ .pyx ของ Cython ไปทำเป็นโมดูลได้ โดยคุณต้องสร้างไฟล์ setup.py
ตัวอย่างเช่น เราต้องการทำโมดูล num โดยใช้ไฟล์ num.pyx
from distutils.core import setup
from Cython.Build import cythonize

setup(
ext_modules = cythonize("num.pyx")
)

เมื่อต้องการติดตั้งให้ใช้คำสั่ง $ python setup.py build_ext --inplace

อ่านเอกสารเพิ่มเติมได้ที่ http://cython.readthedocs.io/en/latest/index.html
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)