作為一種動態語言,Python的語法靈活,表達強大,因此備受大家青睞,成為目前最受歡迎的語言之一。但是與此同時,靈活的語言特性所帶來的代價是性能的降低。因此,Python在一些計算密集型的場景中,與一些底層語言,如C、C++相比,往往顯得力不從心。那麼,Python有沒有辦法在保持優秀語法特性的同時,還能夠在性能上得到提升呢?當然可以。既然C語言的效率高,那麼我們把程序中對性能要求較高的部分用C語言來實現就是一種解決方案。
在本文中,我們將用C語言實現一個Python模塊,並在Python代碼中對其進行調用。作為例子,這個模塊中將包含兩個簡單的函數:
- Hello World
- 斐波那契函數
C文件
首先我們創建一個.c文件,並且加入
#include
其中包含了必要的用C語言實現的Python對象
setup.py
接下來,我們利用Python中提供方法將C代碼作為擴展模塊加入到Python模塊中
構建模塊並運行
執行:
python setup.py build
python setup.py install
我們會得到類似下面的輸出:
$ python3.6 setup.py build
running build
running build_ext
building 'myModule' extension
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c test.c -o build/temp.macosx-10.6-intel-3.6/test.o
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.6/test.o -o build/lib.macosx-10.6-intel-3.6/myModule.cpython-36m-darwin.so
$ python3.6 setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.macosx-10.6-intel-3.6/myModule.cpython-36m-darwin.so -> /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
running install_egg_info
Removing /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/myModule-1.0-py3.6.egg-info
Writing /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/myModule-1.0-py3.6.egg-info
$ python3.6
Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import myModule
>>> myModule.helloworld()
Hello World
>>>
在另外一個例子斐波那契函數中,我們將展示如何在C函數中傳遞參數和返回值:
經過構建後,就可以調用了:
這就是在Python中調用C代碼最基本的用法,希望對大家有用。歡迎大家留言討論。