编译Python可调用的pyd C模块
#include <boost/python.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
#include <Eigen/Dense>
#include <Eigen/Eigenvalues>
#include <Eigen/SVD>
#include <string>
#include <iostream>
#include <chrono>
#include <vector>
using namespace boost::python;
using namespace Eigen;
class SharedMemory {
public:
SharedMemory()
: managed_shm(boost::interprocess::open_or_create, "shm", 1024),
mutex(boost::interprocess::open_or_create, "mtx")
{
mutex.lock();
int *i = managed_shm.find_or_construct<int>("Integer")();
*i = 0;
std::cout << "Created" << std::endl;
}
~SharedMemory() {
managed_shm.destroy<int>("Integer");
mutex.unlock();
std::cout << "Destroyed" << std::endl;
}
void increment() {
int *i = managed_shm.find_or_construct<int>("Integer")();
(*i)++;
std::cout << "Incremented" << std::endl;
}
private:
// 禁用复制构造和赋值
SharedMemory(const SharedMemory&) = delete;
SharedMemory& operator=(const SharedMemory&) = delete;
boost::interprocess::managed_shared_memory managed_shm;
boost::interprocess::named_mutex mutex;
};
// ==================== 辅助函数:Eigen 矩阵转 Python 列表 ====================
// 将 MatrixXd 转换为 Python 嵌套列表
list matrix_to_python_list(const MatrixXd& matrix) {
list result;
for (int i = 0; i < matrix.rows(); ++i) {
list row;
for (int j = 0; j < matrix.cols(); ++j) {
row.append(matrix(i, j));
}
result.append(row);
}
return result;
}
// 将 VectorXd 转换为 Python 列表
list vector_to_python_list(const VectorXd& vec) {
list result;
for (int i = 0; i < vec.size(); ++i) {
result.append(vec(i));
}
return result;
}
// ==================== Eigen3 耗时任务函数 ====================
// 大矩阵乘法 - 计算两个大矩阵的乘积(返回 Python 列表)
list matrix_multiply(int size) {
MatrixXd A = MatrixXd::Random(size, size);
MatrixXd B = MatrixXd::Random(size, size);
MatrixXd C = A * B;
return matrix_to_python_list(C);
}
// 特征值分解 - 计算矩阵的所有特征值和特征向量(返回 Python 列表)
list compute_eigenvalues(int size) {
MatrixXd A = MatrixXd::Random(size, size);
// 使矩阵对称以确保实数特征值
A = (A + A.transpose()) / 2.0;
SelfAdjointEigenSolver<MatrixXd> solver(size);
solver.compute(A);
VectorXd eigenvalues = solver.eigenvalues();
return vector_to_python_list(eigenvalues);
}
// SVD 分解 - 奇异值分解(返回 Python 列表)
list compute_svd(int rows, int cols) {
MatrixXd A = MatrixXd::Random(rows, cols);
JacobiSVD<MatrixXd> svd(A, ComputeThinU | ComputeThinV);
VectorXd singular_values = svd.singularValues();
return vector_to_python_list(singular_values);
}
// 矩阵求逆 - 计算大矩阵的逆矩阵(返回 Python 列表)
list matrix_inverse(int size) {
MatrixXd A = MatrixXd::Random(size, size);
// 添加单位矩阵的倍数以确保矩阵可逆
A += MatrixXd::Identity(size, size) * 0.1;
MatrixXd inv = A.inverse();
return matrix_to_python_list(inv);
}
// 矩阵幂运算 - 计算矩阵的 n 次幂(返回 Python 列表)
list matrix_power(int size, int power) {
MatrixXd A = MatrixXd::Random(size, size);
MatrixXd result = MatrixXd::Identity(size, size);
for (int i = 0; i < power; ++i) {
result = result * A;
}
return matrix_to_python_list(result);
}
// 线性方程组求解 - 求解 Ax = b(返回 Python 列表)
list solve_linear_system(int size) {
MatrixXd A = MatrixXd::Random(size, size);
A += MatrixXd::Identity(size, size) * 0.1; // 确保可逆
VectorXd b = VectorXd::Random(size);
VectorXd x = A.colPivHouseholderQr().solve(b);
return vector_to_python_list(x);
}
// 矩阵行列式计算
double compute_determinant(int size) {
MatrixXd A = MatrixXd::Random(size, size);
A += MatrixXd::Identity(size, size) * 0.1;
return A.determinant();
}
// 矩阵的 Cholesky 分解(用于对称正定矩阵)(返回 Python 列表)
list cholesky_decomposition(int size) {
MatrixXd A = MatrixXd::Random(size, size);
// 构造对称正定矩阵
A = A * A.transpose();
A += MatrixXd::Identity(size, size) * 0.1;
LLT<MatrixXd> llt(A);
MatrixXd L = llt.matrixL();
return matrix_to_python_list(L);
}
// 批量矩阵运算 - 执行多次矩阵乘法(返回 Python 列表)
list batch_matrix_operations(int size, int iterations) {
MatrixXd result = MatrixXd::Identity(size, size);
for (int i = 0; i < iterations; ++i) {
MatrixXd A = MatrixXd::Random(size, size);
result = result * A;
}
return matrix_to_python_list(result);
}
// 带时间测量的矩阵乘法(返回执行时间,单位:毫秒)
double timed_matrix_multiply(int size) {
auto start = std::chrono::high_resolution_clock::now();
MatrixXd A = MatrixXd::Random(size, size);
MatrixXd B = MatrixXd::Random(size, size);
MatrixXd C = A * B;
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
return duration.count() / 1000.0; // 转换为毫秒
}
// ==================== Python 模块导出 ====================
BOOST_PYTHON_MODULE(SharedMemoryModule) {
// 原有的 SharedMemory 类
class_<SharedMemory, boost::noncopyable>("SharedMemory")
.def("increment", &SharedMemory::increment);
// Eigen3 耗时任务函数
def("matrix_multiply", &matrix_multiply, "Multiply two large matrices");
def("compute_eigenvalues", &compute_eigenvalues, "Compute eigenvalues of a matrix");
def("compute_svd", &compute_svd, "Compute SVD decomposition");
def("matrix_inverse", &matrix_inverse, "Compute matrix inverse");
def("matrix_power", &matrix_power, "Compute matrix power");
def("solve_linear_system", &solve_linear_system, "Solve linear system Ax = b");
def("compute_determinant", &compute_determinant, "Compute matrix determinant");
def("cholesky_decomposition", &cholesky_decomposition, "Compute Cholesky decomposition");
def("batch_matrix_operations", &batch_matrix_operations, "Perform batch matrix operations");
def("timed_matrix_multiply", &timed_matrix_multiply, "Matrix multiplication with timing");
}
cmake_minimum_required(VERSION 3.10.0)
project(WindowsApiSolutions VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(fmt CONFIG REQUIRED)
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
find_package(Boost REQUIRED COMPONENTS system filesystem thread date_time python)
find_package(Eigen3 CONFIG REQUIRED)
# Python 扩展模块是共享库
add_library(SharedMemoryModule SHARED src/main.cpp)
set_target_properties(SharedMemoryModule PROPERTIES
PREFIX ""
OUTPUT_NAME "SharedMemoryModule"
# Windows 上 Python 扩展应该使用 .pyd 扩展名
SUFFIX ".pyd"
# 开启 DLL 聚合:自动导出所有符号(无需手动写 .def 文件)
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON
)
target_include_directories(SharedMemoryModule PRIVATE ${Python3_INCLUDE_DIRS})
target_link_libraries(SharedMemoryModule PRIVATE
fmt::fmt
Boost::boost
Boost::system
Boost::filesystem
Boost::thread
Boost::date_time
Boost::python
Eigen3::Eigen
${Python3_LIBRARIES}
)
include(CTest)
enable_testing()
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
stubgen -m SharedMemoryModule 工具得到pyi类型存根文件。