Hello World

需要將 Cython pyx 檔案轉換為 C 程式碼( cythonized )並在從 Python 中使用之前進行編譯。一種常見的方法是建立一個擴充套件模組,然後在 Python 程式中匯入。

在本例中,我們建立了三個檔案:

  • hello.pyx 包含 Cython 程式碼。
  • test.py 是一個使用 hello 擴充套件的 Python 指令碼。
  • setup.py 用於編譯 Cython 程式碼。

hello.pyx

from libc.math cimport pow

cdef double square_and_add (double x):
    """Compute x^2 + x as double.

    This is a cdef function that can be called from within
    a Cython program, but not from Python.
    """
    return pow(x, 2.0) + x

cpdef print_result (double x):
    """This is a cpdef function that can be called from Python."""
    print("({} ^ 2) + {} = {}".format(x, x, square_and_add(x)))

test.py

# Import the extension module hello.
import hello

# Call the print_result method 
hello.print_result(23.0)

setup.py

from distutils.core import Extension, setup
from Cython.Build import cythonize

# define an extension that will be cythonized and compiled
ext = Extension(name="hello", sources=["hello.pyx"])
setup(ext_modules=cythonize(ext))

編譯

這可以通過使用 cython hello.pyx 將程式碼轉換為 C 然後使用 gcc 進行編譯來完成。更簡單的方法是讓 distutils 處理這個:

$ ls
hello.pyx  setup.py  test.py
$ python setup.py build_ext --inplace
$ ls
build  hello.c  hello.cpython-34m.so  hello.pyx  setup.py  test.py

共享物件(.so)檔案可以從 Python 匯入和使用,所以現在我們可以執行 test.py

$ python test.py
(23.0 ^ 2) + 23.0 = 552.0