眾所周知,python是一種解釋性語言。雖然使用了虛擬機,宏代碼生成inline代碼的方式來進行加速,但是由于其天生的GIL鎖,動態等天生劣勢,導致代碼執行效率慢于傳統靜態語言。目前的大部分思路都是大部分功能性代碼使用python。關鍵性能部分使用c來寫擴展。下面就逐一來測試下各個方式的性能及優劣。
- python的c擴展
- cython
- ctypes調用so庫
- matx
首先前四章分別介紹下使用方法。本章主要介紹c擴展的方法。
1.創建my_extend.c文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Python.h>
//具體實現函數。實現循環次數累加并返回
int count(int n){
int ans=0;
for(int i=0;i<=n;i++){
ans= ans + 1;
}
return ans;
}
//python的函數封裝,解析python參數,將參數轉為c類型并調用實際的c函數
static PyObject *Extest_count(PyObject *self,PyObject *args){
int num;
if(!(PyArg_ParseTuple(args,"i",&num))){
return NULL;
}
return (PyObject*)Py_BuildValue("i",count(num));
}
//為每個模塊增加PyMethodDef ModuleMethods[]數組
static PyMethodDef ExtestMethods[] = {
{"count",Extest_count,METH_VARARGS},
{NULL,NULL},
};
//模塊定義
static struct PyModuleDef ExtestModule = {
PyModuleDef_HEAD_INIT,
"Extest",
NULL,
-1,
ExtestMethods
};
//模塊注冊函數PyInit_Extest為函數名,PyInit_為指定前綴,Extest為模塊名稱
void PyInit_Extest(){
PyModule_Create(&ExtestModule);
}
編寫編譯文件,創建setup.py文件
from distutils.core import setup,Extension
MOD = 'Extest' # 模塊名
cpp_args = ["-O2"] # 由于matx默認使用o2級別優化。所以所有的測試都默認使用o2級別優化
setup(
name=MOD,
ext_modules=[Extension(MOD,sources=['my_extend.c'], extra_compile_args=cpp_args)],
) #源文件名
執行python3 setup.py build
將build文件夾下lib.操作系統.架構-python版本文件夾下的so庫文件拷貝到測試目錄。
編寫test.py文件
from Extest import count
print(count(9999))
執行文件即可