Bản chất cơ bản của Cython có thể được tóm tắt như sau: Cython là Python với kiểu dữ liệu C.
Hầu như bất kỳ đoạn mã Python nào cũng là mã Cython hợp lệ.
TÓM LẠI NGẮN GỌN LÀ CÁC ÔNG CHUYỂN HẾT KIỂU DỮ LIỆU CỦA CODE PYTHON THÀNH KIỂU DỮ LIỆU CỦA C RỒI BIÊN DỊCH NÓ
Cách cài đặt Cython
Để cài đặt cython bạn gõ lệnh sau ở terminal hoặc env đã active của bạn
pip install Cython
Cython Hello World
Tạo thư mục chứa code cự án của bạn và di chuyển con trỏ lệnh vào thư mục đó.
mkdir myfolder
cd myfolder
Khởi tạo và setup cython project
Tạo file helloworld.pyx
trong thư mục ở trên với nội dung
print("Hello World")
Tạo file setup.py
trong cùng thư mục trên với nội dung như sau
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("helloworld.pyx")
)
đây là file cấu hình settup sau này bạn có thể thêm các module mở rộng khác vào đây.
biên dịch code cython
Để sử dụng hãy gõ vào cửa sổ dòng lệnh sau để biên dịch code của bạn:
python setup.py build_ext --inplace
import cython và chạy
bây giờ bạn có thể import và sử dụng nó trong các file khác ví dụ
tạo file main.py
với nội dung
import helloworld
Chạy file main.py
bằng lệnh sau ở cửa sổ dòng lệnh
python main.py
Cú pháp Cython cơ bản
Hầu như tất cả code python đều hợp lệ trong cython. Nhưng để tối ưu và nhanh hơn thì các bạn cần chuyển tất cả biến của python thành biến cython.
Tại sao python chạy chậm hơn C/C++
Vì tại thời điểm chạy, trình thông dịch thực hiện rất nhiều công việc tìm kiếm không gian tên, tìm nạp thuộc tính và phân tích cú pháp đối số và bộ từ khóa điều này khiến cho python lập trình thì thoải mái nhưng khi chạy thì rất chậm.
"Liên kết muộn" trong thời gian chạy này là nguyên nhân chính gây ra sự chậm chạp tương đối của Python so với các ngôn ngữ "liên kết sớm" như C ++.
Khai báo biến trong cython
ví dụ về khai báo biến toàn cục và biến cục bộ.
cdef int a_global_variable
def func():
cdef int i, j, k
cdef float f, g[42], *h
C struct, union và enum được hỗ trợ:
cdef struct Grail:
int age
float volume
cdef union Food:
char *spam
float *eggs
cdef enum CheeseType:
cheddar, edam,
camembert
cdef enum CheeseState:
hard = 1
soft = 2
runny = 3
Khai báo một biến con trỏ trỏ đến cấu trúc Grail
cdef Grail *gp
Đặt tên cho kiểu dữ liệu
ctypedef unsigned long ULong
# unsigned long quá dài nên rút gọn thành ULong cho dễ gõ
ctypedef int* IntPtr
Khai báo một hàm
cdef int eggs(unsigned long l, float f):
...
Khai báo một class
Chúng rất gần với các class python, nhưng nhanh hơn vì chúng sử dụng một struct
bên trong để lưu trữ các thuộc tính.
from __future__ import print_function
cdef class Shrubbery:
cdef int width
cdef int height
def __init__(self, w, h):
self.width = w
self.height = h
def describe(self):
print("This shrubbery is", self.width,
"by", self.height, "cubits.")
Một số lưu ý về hàm trong cython và python
def functionExample(int x, float y):
# function có thể gọi Python and Cython
return y * x
cdef functionExample(int x, float y):
# hàm chỉ có thể gọi từ Cython(optimized)
return y*x
cpdef functionExample(int x, float y):
# hàm có thể gọi từ Cython(optimized)
# hàm có thể gọi từ Python (unoptimized)
return y*x
Hơn nữa, kiểu trả về có thể được thêm vào hàm:
cdef float functionExample(int x, float y):
# Hàm được tối ưu hóa và chỉ có thể gọi từ Cython
return y*x
import numpy vào cython
nhớ install numpy bằng lệnh
pip install numpy
rồi sửa file setup.py
from distutils.core import setup
from Cython.Build import cythonize
import numpy
setup(
ext_modules=[
Extension("helloworld", ["helloworld.c"],
include_dirs=[numpy.get_include()]),
],
)
setup(
ext_modules=cythonize("helloworld.pyx"),
include_dirs=[numpy.get_include()]
)
trong file code helloworld.pyx
bạn import như sau vào
import numpy as np
cimport numpy as np
np.import_array()