Cython不僅僅是一種編程語言。它的起源可以追溯到SAGE數學軟件包,它用于提高數學計算性能,例如涉及矩陣的計算。更一般地說,我傾向于將Cython視為SWIG的替代品,為本機代碼生成非常好的Python綁定。
SWIG是最早和最好之一,用于生成多種語言的綁定的工具。 Cython僅限Python代碼。
通過生成語言綁定來處理遺留軟件的很好方式,對C / C ++編寫的遺留應用程序,用Python添加新功能。
第一章將專注于使用Cython的核心概念
安裝Cython
Hello World
使用distutils
Python調用C函數
類型轉換
安裝
Linux及Mac:
pip install Cython
Linux發行版本:
$ yum install cython
# will work on Fedora and Centos
$ apt-get install cython # will work on Debian based systems.
Hello World!
helloworld.pyx
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: xurongzhong#126.com
# CreateDate: 2018-9-20
# 技術支持qq群: 144081101 591302926 567351477 釘釘免費群:21745728
print("Hello World from cython!")
Makefile
all:
cython -3 -o helloworld.c helloworld.pyx
gcc -g -O2 -fpic -c helloworld.c -o helloworld.o `python3-config --cflags`
gcc -g -O2 -shared -o helloworld.so helloworld.o `python3-config --libs`
clean:
rm -rf *.c *.o *.so build
執行
$ make
cython -3 -o helloworld.c helloworld.pyx
gcc -g -O2 -fpic -c helloworld.c -o helloworld.o `python3-config --cflags`
gcc -g -O2 -shared -o helloworld.so helloworld.o `python3-config --libs`
$ python
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import helloworld
Hello World from cython!
image.png
使用distutils編譯
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: xurongzhong#126.com
# CreateDate: 2018-9-20
# 技術支持qq群: 144081101 591302926 567351477 釘釘免費群:21745728
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("helloworld.pyx")
)
執行
$ python setup.py build_ext --inplace
running build_ext
building 'helloworld' extension
gcc -pthread -B /usr/local/anaconda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/anaconda/include/python3.6m -c helloworld.c -o build/temp.linux-x86_64-3.6/helloworld.o
gcc -pthread -shared -B /usr/local/anaconda/compiler_compat -L/usr/local/anaconda/lib -Wl,-rpath=/usr/local/anaconda/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.6/helloworld.o -o /home/andrew/code/cython-book/chapter1/helloworld/helloworld.cpython-36m-x86_64-linux-gnu.so
$ python
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import helloworld
Hello World from cython!
此處如果不添加 --inplace,則編譯在默認目錄
$ python setup.py build_ext
running build_ext
building 'helloworld' extension
gcc -pthread -B /usr/local/anaconda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/anaconda/include/python3.6m -c helloworld.c -o build/temp.linux-x86_64-3.6/helloworld.o
gcc -pthread -shared -B /usr/local/anaconda/compiler_compat -L/usr/local/anaconda/lib -Wl,-rpath=/usr/local/anaconda/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.6/helloworld.o -o build/lib.linux-x86_64-3.6/helloworld.cpython-36m-x86_64-linux-gnu.so
在root下面執行python3 setup.py install則會安裝為系統庫
# python3 setup.py build_ext
running build_ext
# python3 setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.linux-x86_64-3.6/helloworld.cpython-36m-x86_64-linux-gnu.so -> /usr/local/anaconda/lib/python3.6/site-packages
running install_egg_info
Writing /usr/local/anaconda/lib/python3.6/site-packages/UNKNOWN-0.0.0-py3.6.egg-info
Python調用C函數
AddFunction.c
#include
int AddFunction(int x, int y) {
printf("look we are within your c code!!\n");
return x + y;
}
AddFunction.h
#ifndef __ADDFUNCTION_H__
#define __ADDFUNCTION_H__
extern int AddFunction(int, int);
#endif //__ADDFUNCTION_H__
PyAddFunction.pyx
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: xurongzhong#126.com
# CreateDate: 2018-9-20
# 技術支持qq群: 144081101 591302926 567351477 釘釘免費群:21745728
cdef extern from "AddFunction.h":
cdef int AddFunction(int, int)
def Add(a, b):
return AddFunction(a, b)
執行
$ make
cython -3 PyAddFunction.pyx
gcc -g -O2 -fpic -c PyAddFunction.c -o PyAddFunction.o `python3-config --includes`
gcc -g -O2 -fpic -c AddFunction.c -o AddFunction.o
gcc -g -O2 -shared -o PyAddFunction.so AddFunction.o PyAddFunction.o `python3-config --libs`
$ python
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from PyAddFunction import Add
>>> Add(1,2)
look we are within your c code!!
3
參考資料