技術積累——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 了!
當然肯定會有很多其他方式處理該問題,如果各位大佬有更好的方式,可以留言哦
相關文章
- 日常技術積累
- 熱點部落格,技術歷程和技術積累 (個人)
- 工作中如何做好技術積累
- Android技術積累:圖片快取管理Android快取
- 備忘錄:hadoop技術一點積累Hadoop
- 專案---累積型快照事實表sqlSQL
- 開源專案積累,用於不同領域構建和團隊技術方向使用方案
- [專案積累]後端專案之Koa2經驗整理後端
- 我的專案開發經驗積累總結
- 【技術積累】軟體設計模式【第一版】設計模式
- 8月21日至8月27日技術積累
- 【技術積累】如何處理Feign的超時問題
- Python3的使用積累Python
- postfix配置積累(不斷的積累)
- 工作中如何做好技術積累(摘自美團點評技術團隊部落格)
- 【技術積累】騰訊/阿里雲物件儲存上傳+刪除阿里物件
- 累【非技術貼】
- Oracle積累Oracle
- 日常積累——彙編檔案編寫
- 做好技術的量的累積,實現業績的質的飛躍|專訪宜信財富技術負責人劉寶劍
- vue 個人積累Vue
- lunix 命令積累
- 日期操作積累
- linux 積累Linux
- Python 專案配置管理框架技術選型Python框架
- React專案技術棧React
- 為了你能愉快地積累Python專案,我做了一份手把手的GitHub教程PythonGithub
- 網際網路金融專案——工作日誌(一)之點滴積累
- 網際網路金融專案——工作日誌(二)之點滴積累
- 工作點滴積累
- 日常知識積累
- 機器學習知識積累機器學習
- java問題積累Java
- javascript程式碼積累JavaScript
- LINUX命令積累Linux
- 正則命令積累
- 快取框架積累快取框架
- js積累函式JS函式