技術積累——C++ 呼叫 python 專案
背景
公司目前用 C++ 在開發一些專案,但是某些演算法部分為了提效(開發效率),使用了 python 指令碼開發;為了 python 專案部分合入 C++
方案
目前想到兩個方案:
1、python 指令碼轉成 C++:這塊就需要一個非常專業的 C++ 高手來做,並且 python 的第三方庫太優秀了,很多 C++ 都是沒有現成的,時間成本太大了
2、C++ 呼叫 python:從執行效率上來講,python 肯定會比 C++ 慢,但是在資料處理方面,是 python 的強項,所以我們選擇了這種方案
制定具體方案
使用 C++ 呼叫 python 也有幾種方式:
1、把 python 打包成可執行檔案,透過新增引數呼叫
2、直接使用 C++ 呼叫 python 指令碼
3、直接使用 C++ 呼叫命令列 python.exe 直譯器
實施
可執行檔案方式
我們最開始先用了這個方式來做,打包選用的 pyinstaller,之前用過 python 編寫 GUI 的同學可能都知道,有一個很惱火的地方是每次打包出來的檔案非常大,至少都是幾十 M 起步,就算使用 upx 壓縮工具,基本壓縮有也有幾兆
我們打包成功後,直接使用命令列執行嘗試:發現一個目前能力上無法理解的問題:正常指令碼執行只需要 1.6s 左右;打包成 exe 後執行需要 5~9s(希望大佬幫忙解釋下),雖然能用,但是效能消耗太大了
C++ 呼叫 python 專案
這個網上很多教程,找到一個沒坑的:https://zhuanlan.zhihu.com/p/271219435
也是可以直接使用,執行之後,耗時執行 python 只花費了不到 1s
但是有個核心問題就是能看到原始碼,所以又考慮到這個問題,最後又去把核心原始碼打包成 pyd 格式
步驟如下:
1、構建 setup.py 指令碼:
from setuptools import setup
from Cython.Build import cythonize
setup(name='my_module', ext_modules=cythonize(r'F:\py\temp\my_module.py'))
2、在命令列中,執行命令:python setup.py build_ext --inplace
python: Python 直譯器可執行檔案的路徑(預設使用環境變數的配置路徑)。
setup.py:Python 指令碼檔案,用於定義 Python 包的構建和安裝方式。通常,這個檔案會包含一些後設資料和構建指令,以告訴 setuptools(Python 的一個包管理工具)如何構建和安裝這個包。
python setup.py:使用 python 命令,執行 Python 指令碼檔案。
build_ext: Python 定義的一個命令,用於構建擴充套件模組。
--inplace:可選。表示編譯後的 .pyd 檔案儲存在預設的構建目錄中,複製一份到當前目錄中。
這樣就可以使用 C++ 呼叫 python 了!
當然肯定會有很多其他方式處理該問題,如果各位大佬有更好的方式,可以留言哦
相關文章
- 工作中如何做好技術積累
- 專案---累積型快照事實表sqlSQL
- [專案積累]後端專案之Koa2經驗整理後端
- 【技術積累】如何處理Feign的超時問題
- Python3的使用積累Python
- 【技術積累】軟體設計模式【第一版】設計模式
- Python 專案配置管理框架技術選型Python框架
- 【技術積累】騰訊/阿里雲物件儲存上傳+刪除阿里物件
- 工作中如何做好技術積累(摘自美團點評技術團隊部落格)
- PS積累
- 日常積累——彙編檔案編寫
- React專案技術棧React
- python 新建專案呼叫已安裝模板Python
- Python呼叫C/C++方式PythonC++
- Qt中用C++呼叫Python檔案的三種方法QTC++Python
- 為了你能愉快地積累Python專案,我做了一份手把手的GitHub教程PythonGithub
- 做好技術的量的累積,實現業績的質的飛躍|專訪宜信財富技術負責人劉寶劍
- vue專案技術小記Vue
- lunix 命令積累
- Python 專案及依賴管理工具技術選型Python
- 技術解讀:現代化工具鏈在大規模 C++ 專案中的運用 | 龍蜥技術C++
- 社交專案中用到的技術
- Flutter OnePass 專案技術方案分享Flutter
- Python呼叫C++編寫的方法PythonC++
- Python與C/C++呼叫之ctypesPythonC++
- Windows上Python使用swig呼叫C++WindowsPythonC++
- linux下qt用c++呼叫pythonLinuxQTC++Python
- python和c++的相互呼叫教程PythonC++
- 日常知識積累
- 工作點滴積累
- java問題積累Java
- js積累函式JS函式
- vue 個人積累Vue
- 精通 Python 網路爬蟲:核心技術、框架與專案實戰Python爬蟲框架
- C++的技術C++
- 功德+N!Python敲擊木魚積累功德程式碼Python
- 前端技術演進(六):前端專案與技術實踐前端
- IOS技術分享| anyLive 開源專案iOS