1.封装cpp给python调用,提高程序开发和运行效率
发表于更新于
字数总计:385阅读时长:1分钟阅读量:       新加坡
1.封装cpp给python调用,提高程序开发和运行效率
FrWalker将cpp代码编译成python可以调用的模块,充分利用两种语言的优缺点互补,提高程序开发和运行效率
目录
| 12
 3
 4
 5
 6
 7
 
 | project/├── build/
 │   ├── example.pyd
 │   └── ...
 ├── example.cpp
 ├── main.py
 └── CMakeLists.txt
 
 | 
环境安装
代码准备
example.cpp
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | #include <pybind11/pybind11.h>
 class MyClass
 {
 public:
 MyClass(int val) : value(val) {}
 
 int get_value() const
 {
 return value;
 }
 
 void set_value(int val)
 {
 value = val;
 }
 
 int add(int a) const
 {
 return value + a;
 }
 
 private:
 int value;
 };
 
 PYBIND11_MODULE(example, m)
 {
 pybind11::class_<MyClass>(m, "MyClass")
 .def(pybind11::init<int>())
 .def("get_value", &MyClass::get_value)
 .def("set_value", &MyClass::set_value)
 .def("add", &MyClass::add);
 }
 
 | 
cmake编译
CMakeLists.txt
mkdir build
cd build
cmake .. -G "MinGW Makefiles"
make
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | cmake_minimum_required(VERSION 3.12)project(example)
 
 set(CMAKE_CXX_STANDARD 14)
 
 # Find pybind11
 set(CMAKE_PREFIX_PATH "d:/English/anaconda3/Lib/site-packages/pybind11/share/cmake/pybind11" ${CMAKE_PREFIX_PATH})
 find_package(pybind11 REQUIRED)
 
 # 创建共享库(.pyd)
 add_library(example MODULE example.cpp)
 
 # 设置输出文件扩展名为 .pyd
 set_target_properties(example PROPERTIES
 PREFIX ""
 SUFFIX ".pyd"
 )
 # 链接 pybind11 库
 target_link_libraries(example PRIVATE pybind11::module)
 
 | 
python调用
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | import build.example as example
 obj = example.MyClass(10)
 
 print(obj.get_value())
 obj.set_value(20)
 print(obj.get_value())
 
 result = obj.add(5)
 print(result)
 
 | 
应用
见第五届EDA精英挑战赛赛题八-标准单元电路的版图自动生成,将模拟退火的关键部分使用c++实现,并封装成python模块,再结合python标准库实现晶体版图自动布局,效率提高为纯c++的两倍和纯python的数倍。




FrWalker
a blog for sharing my thoughts and experiences
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 FrWalker Blog!