亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

python3性能加速幾種方式及性能(一)

2023-04-24 01:57:18
21
0

眾所周知,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))

執行文件即可

0條評論
0 / 1000
s****n
8文章數
0粉絲數
s****n
8 文章 | 0 粉絲
原創

python3性能加速幾種方式及性能(一)

2023-04-24 01:57:18
21
0

眾所周知,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))

執行文件即可

文章來自個人專欄
文章 | 訂閱
0條評論
0 / 1000
請輸入你的評論
0
0