[{"data":1,"prerenderedAt":1308},["ShallowReactive",2],{"page-\u002Fcpp\u002Fboost\u002F编译python可调用的pyd-c模块":3},{"id":4,"title":5,"body":6,"description":15,"extension":1302,"meta":1303,"navigation":86,"path":1304,"seo":1305,"stem":1306,"__hash__":1307},"content\u002Fcpp\u002Fboost\u002F编译Python可调用的pyd-C模块.md","编译Python可调用的pyd C模块",{"type":7,"value":8,"toc":1300},"minimark",[9,1098,1292,1296],[10,11,16],"pre",{"className":12,"code":13,"language":14,"meta":15,"style":15},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cboost\u002Fpython.hpp>\n#include \u003Cboost\u002Finterprocess\u002Fmanaged_shared_memory.hpp>\n#include \u003Cboost\u002Finterprocess\u002Fsync\u002Fnamed_mutex.hpp>\n#include \u003CEigen\u002FDense>\n#include \u003CEigen\u002FEigenvalues>\n#include \u003CEigen\u002FSVD>\n#include \u003Cstring>\n#include \u003Ciostream>\n#include \u003Cchrono>\n#include \u003Cvector>\n\nusing namespace boost::python;\nusing namespace Eigen;\nclass SharedMemory {\n    public:\n        SharedMemory()\n            : managed_shm(boost::interprocess::open_or_create, \"shm\", 1024),\n              mutex(boost::interprocess::open_or_create, \"mtx\")\n        {\n            mutex.lock();\n            int *i = managed_shm.find_or_construct\u003Cint>(\"Integer\")();\n            *i = 0;\n            std::cout \u003C\u003C \"Created\" \u003C\u003C std::endl;\n        }\n        ~SharedMemory() {\n            managed_shm.destroy\u003Cint>(\"Integer\");\n            mutex.unlock();\n            std::cout \u003C\u003C \"Destroyed\" \u003C\u003C std::endl;\n        }\n        void increment() {\n            int *i = managed_shm.find_or_construct\u003Cint>(\"Integer\")();\n            (*i)++;\n            std::cout \u003C\u003C \"Incremented\" \u003C\u003C std::endl;\n        }\n    private:\n        \u002F\u002F 禁用复制构造和赋值\n        SharedMemory(const SharedMemory&) = delete;\n        SharedMemory& operator=(const SharedMemory&) = delete;\n        boost::interprocess::managed_shared_memory managed_shm;\n        boost::interprocess::named_mutex mutex;\n};\n\n\u002F\u002F ==================== 辅助函数：Eigen 矩阵转 Python 列表 ====================\n\n  \n\u002F\u002F 将 MatrixXd 转换为 Python 嵌套列表\nlist matrix_to_python_list(const MatrixXd& matrix) {\n    list result;\n    for (int i = 0; i \u003C matrix.rows(); ++i) {\n        list row;\n        for (int j = 0; j \u003C matrix.cols(); ++j) {\n            row.append(matrix(i, j));\n        }\n        result.append(row);\n    }\n    return result;\n}\n\n  \n\u002F\u002F 将 VectorXd 转换为 Python 列表\nlist vector_to_python_list(const VectorXd& vec) {\n    list result;\n    for (int i = 0; i \u003C vec.size(); ++i) {\n        result.append(vec(i));\n    }\n    return result;\n}\n\n\u002F\u002F ==================== Eigen3 耗时任务函数 ====================\n\n\n\u002F\u002F 大矩阵乘法 - 计算两个大矩阵的乘积（返回 Python 列表）\nlist matrix_multiply(int size) {\n    MatrixXd A = MatrixXd::Random(size, size);\n    MatrixXd B = MatrixXd::Random(size, size);\n    MatrixXd C = A * B;\n    return matrix_to_python_list(C);\n}\n\n  \n\n\u002F\u002F 特征值分解 - 计算矩阵的所有特征值和特征向量（返回 Python 列表）\nlist compute_eigenvalues(int size) {\n    MatrixXd A = MatrixXd::Random(size, size);\n    \u002F\u002F 使矩阵对称以确保实数特征值\n    A = (A + A.transpose()) \u002F 2.0;\n    SelfAdjointEigenSolver\u003CMatrixXd> solver(size);\n    solver.compute(A);\n    VectorXd eigenvalues = solver.eigenvalues();\n    return vector_to_python_list(eigenvalues);\n}\n \n\u002F\u002F SVD 分解 - 奇异值分解（返回 Python 列表）\nlist compute_svd(int rows, int cols) {\n    MatrixXd A = MatrixXd::Random(rows, cols);\n    JacobiSVD\u003CMatrixXd> svd(A, ComputeThinU | ComputeThinV);\n    VectorXd singular_values = svd.singularValues();\n    return vector_to_python_list(singular_values);\n}\n\n\u002F\u002F 矩阵求逆 - 计算大矩阵的逆矩阵（返回 Python 列表）\nlist matrix_inverse(int size) {\n    MatrixXd A = MatrixXd::Random(size, size);\n    \u002F\u002F 添加单位矩阵的倍数以确保矩阵可逆\n    A += MatrixXd::Identity(size, size) * 0.1;\n    MatrixXd inv = A.inverse();\n    return matrix_to_python_list(inv);\n}\n\n\u002F\u002F 矩阵幂运算 - 计算矩阵的 n 次幂（返回 Python 列表）\nlist matrix_power(int size, int power) {\n    MatrixXd A = MatrixXd::Random(size, size);\n    MatrixXd result = MatrixXd::Identity(size, size);\n    for (int i = 0; i \u003C power; ++i) {\n        result = result * A;\n    }\n    return matrix_to_python_list(result);\n}\n\n\u002F\u002F 线性方程组求解 - 求解 Ax = b（返回 Python 列表）\nlist solve_linear_system(int size) {\n    MatrixXd A = MatrixXd::Random(size, size);\n    A += MatrixXd::Identity(size, size) * 0.1; \u002F\u002F 确保可逆\n    VectorXd b = VectorXd::Random(size);\n    VectorXd x = A.colPivHouseholderQr().solve(b);\n    return vector_to_python_list(x);\n}\n\n\u002F\u002F 矩阵行列式计算\n\ndouble compute_determinant(int size) {\n    MatrixXd A = MatrixXd::Random(size, size);\n    A += MatrixXd::Identity(size, size) * 0.1;\n    return A.determinant();\n}\n\n  \n\u002F\u002F 矩阵的 Cholesky 分解（用于对称正定矩阵）（返回 Python 列表）\nlist cholesky_decomposition(int size) {\n    MatrixXd A = MatrixXd::Random(size, size);\n    \u002F\u002F 构造对称正定矩阵\n    A = A * A.transpose();\n    A += MatrixXd::Identity(size, size) * 0.1;\n    LLT\u003CMatrixXd> llt(A);\n    MatrixXd L = llt.matrixL();\n    return matrix_to_python_list(L);\n}\n  \n\u002F\u002F 批量矩阵运算 - 执行多次矩阵乘法（返回 Python 列表）\nlist batch_matrix_operations(int size, int iterations) {\n    MatrixXd result = MatrixXd::Identity(size, size);\n    for (int i = 0; i \u003C iterations; ++i) {\n        MatrixXd A = MatrixXd::Random(size, size);\n        result = result * A;\n    }\n    return matrix_to_python_list(result);\n}\n\n\n\u002F\u002F 带时间测量的矩阵乘法（返回执行时间，单位：毫秒）\ndouble timed_matrix_multiply(int size) {\n    auto start = std::chrono::high_resolution_clock::now();\n    MatrixXd A = MatrixXd::Random(size, size);\n    MatrixXd B = MatrixXd::Random(size, size);\n    MatrixXd C = A * B;\n    auto end = std::chrono::high_resolution_clock::now();\n    auto duration = std::chrono::duration_cast\u003Cstd::chrono::microseconds>(end - start);\n    return duration.count() \u002F 1000.0; \u002F\u002F 转换为毫秒\n}\n\n  \n\n\u002F\u002F ==================== Python 模块导出 ====================\nBOOST_PYTHON_MODULE(SharedMemoryModule) {\n    \u002F\u002F 原有的 SharedMemory 类\n    class_\u003CSharedMemory, boost::noncopyable>(\"SharedMemory\")\n        .def(\"increment\", &SharedMemory::increment);\n    \u002F\u002F Eigen3 耗时任务函数\n    def(\"matrix_multiply\", &matrix_multiply, \"Multiply two large matrices\");\n    def(\"compute_eigenvalues\", &compute_eigenvalues, \"Compute eigenvalues of a matrix\");\n    def(\"compute_svd\", &compute_svd, \"Compute SVD decomposition\");\n    def(\"matrix_inverse\", &matrix_inverse, \"Compute matrix inverse\");\n    def(\"matrix_power\", &matrix_power, \"Compute matrix power\");\n    def(\"solve_linear_system\", &solve_linear_system, \"Solve linear system Ax = b\");\n    def(\"compute_determinant\", &compute_determinant, \"Compute matrix determinant\");\n    def(\"cholesky_decomposition\", &cholesky_decomposition, \"Compute Cholesky decomposition\");\n    def(\"batch_matrix_operations\", &batch_matrix_operations, \"Perform batch matrix operations\");\n    def(\"timed_matrix_multiply\", &timed_matrix_multiply, \"Matrix multiplication with timing\");\n}\n","cpp","",[17,18,19,27,33,39,45,51,57,63,69,75,81,88,94,100,106,112,118,124,130,136,142,148,154,160,166,172,178,184,190,195,201,206,212,218,223,229,235,241,247,253,259,265,270,276,281,287,293,299,305,311,317,323,329,334,340,346,352,358,363,368,374,380,385,391,397,402,407,412,417,423,428,433,439,445,451,457,463,469,474,479,484,489,495,501,506,512,518,524,530,536,542,547,553,559,565,571,577,583,589,594,599,605,611,616,622,628,634,640,645,650,656,662,667,673,679,685,690,696,701,706,712,718,723,729,735,741,747,752,757,763,768,774,779,784,790,795,800,805,811,817,822,828,834,839,845,851,857,862,867,873,879,884,890,896,901,906,911,916,921,926,932,938,944,949,954,959,965,971,977,982,987,992,997,1003,1009,1015,1021,1027,1033,1039,1045,1051,1057,1063,1069,1075,1081,1087,1093],"code",{"__ignoreMap":15},[20,21,24],"span",{"class":22,"line":23},"line",1,[20,25,26],{},"#include \u003Cboost\u002Fpython.hpp>\n",[20,28,30],{"class":22,"line":29},2,[20,31,32],{},"#include \u003Cboost\u002Finterprocess\u002Fmanaged_shared_memory.hpp>\n",[20,34,36],{"class":22,"line":35},3,[20,37,38],{},"#include \u003Cboost\u002Finterprocess\u002Fsync\u002Fnamed_mutex.hpp>\n",[20,40,42],{"class":22,"line":41},4,[20,43,44],{},"#include \u003CEigen\u002FDense>\n",[20,46,48],{"class":22,"line":47},5,[20,49,50],{},"#include \u003CEigen\u002FEigenvalues>\n",[20,52,54],{"class":22,"line":53},6,[20,55,56],{},"#include \u003CEigen\u002FSVD>\n",[20,58,60],{"class":22,"line":59},7,[20,61,62],{},"#include \u003Cstring>\n",[20,64,66],{"class":22,"line":65},8,[20,67,68],{},"#include \u003Ciostream>\n",[20,70,72],{"class":22,"line":71},9,[20,73,74],{},"#include \u003Cchrono>\n",[20,76,78],{"class":22,"line":77},10,[20,79,80],{},"#include \u003Cvector>\n",[20,82,84],{"class":22,"line":83},11,[20,85,87],{"emptyLinePlaceholder":86},true,"\n",[20,89,91],{"class":22,"line":90},12,[20,92,93],{},"using namespace boost::python;\n",[20,95,97],{"class":22,"line":96},13,[20,98,99],{},"using namespace Eigen;\n",[20,101,103],{"class":22,"line":102},14,[20,104,105],{},"class SharedMemory {\n",[20,107,109],{"class":22,"line":108},15,[20,110,111],{},"    public:\n",[20,113,115],{"class":22,"line":114},16,[20,116,117],{},"        SharedMemory()\n",[20,119,121],{"class":22,"line":120},17,[20,122,123],{},"            : managed_shm(boost::interprocess::open_or_create, \"shm\", 1024),\n",[20,125,127],{"class":22,"line":126},18,[20,128,129],{},"              mutex(boost::interprocess::open_or_create, \"mtx\")\n",[20,131,133],{"class":22,"line":132},19,[20,134,135],{},"        {\n",[20,137,139],{"class":22,"line":138},20,[20,140,141],{},"            mutex.lock();\n",[20,143,145],{"class":22,"line":144},21,[20,146,147],{},"            int *i = managed_shm.find_or_construct\u003Cint>(\"Integer\")();\n",[20,149,151],{"class":22,"line":150},22,[20,152,153],{},"            *i = 0;\n",[20,155,157],{"class":22,"line":156},23,[20,158,159],{},"            std::cout \u003C\u003C \"Created\" \u003C\u003C std::endl;\n",[20,161,163],{"class":22,"line":162},24,[20,164,165],{},"        }\n",[20,167,169],{"class":22,"line":168},25,[20,170,171],{},"        ~SharedMemory() {\n",[20,173,175],{"class":22,"line":174},26,[20,176,177],{},"            managed_shm.destroy\u003Cint>(\"Integer\");\n",[20,179,181],{"class":22,"line":180},27,[20,182,183],{},"            mutex.unlock();\n",[20,185,187],{"class":22,"line":186},28,[20,188,189],{},"            std::cout \u003C\u003C \"Destroyed\" \u003C\u003C std::endl;\n",[20,191,193],{"class":22,"line":192},29,[20,194,165],{},[20,196,198],{"class":22,"line":197},30,[20,199,200],{},"        void increment() {\n",[20,202,204],{"class":22,"line":203},31,[20,205,147],{},[20,207,209],{"class":22,"line":208},32,[20,210,211],{},"            (*i)++;\n",[20,213,215],{"class":22,"line":214},33,[20,216,217],{},"            std::cout \u003C\u003C \"Incremented\" \u003C\u003C std::endl;\n",[20,219,221],{"class":22,"line":220},34,[20,222,165],{},[20,224,226],{"class":22,"line":225},35,[20,227,228],{},"    private:\n",[20,230,232],{"class":22,"line":231},36,[20,233,234],{},"        \u002F\u002F 禁用复制构造和赋值\n",[20,236,238],{"class":22,"line":237},37,[20,239,240],{},"        SharedMemory(const SharedMemory&) = delete;\n",[20,242,244],{"class":22,"line":243},38,[20,245,246],{},"        SharedMemory& operator=(const SharedMemory&) = delete;\n",[20,248,250],{"class":22,"line":249},39,[20,251,252],{},"        boost::interprocess::managed_shared_memory managed_shm;\n",[20,254,256],{"class":22,"line":255},40,[20,257,258],{},"        boost::interprocess::named_mutex mutex;\n",[20,260,262],{"class":22,"line":261},41,[20,263,264],{},"};\n",[20,266,268],{"class":22,"line":267},42,[20,269,87],{"emptyLinePlaceholder":86},[20,271,273],{"class":22,"line":272},43,[20,274,275],{},"\u002F\u002F ==================== 辅助函数：Eigen 矩阵转 Python 列表 ====================\n",[20,277,279],{"class":22,"line":278},44,[20,280,87],{"emptyLinePlaceholder":86},[20,282,284],{"class":22,"line":283},45,[20,285,286],{},"  \n",[20,288,290],{"class":22,"line":289},46,[20,291,292],{},"\u002F\u002F 将 MatrixXd 转换为 Python 嵌套列表\n",[20,294,296],{"class":22,"line":295},47,[20,297,298],{},"list matrix_to_python_list(const MatrixXd& matrix) {\n",[20,300,302],{"class":22,"line":301},48,[20,303,304],{},"    list result;\n",[20,306,308],{"class":22,"line":307},49,[20,309,310],{},"    for (int i = 0; i \u003C matrix.rows(); ++i) {\n",[20,312,314],{"class":22,"line":313},50,[20,315,316],{},"        list row;\n",[20,318,320],{"class":22,"line":319},51,[20,321,322],{},"        for (int j = 0; j \u003C matrix.cols(); ++j) {\n",[20,324,326],{"class":22,"line":325},52,[20,327,328],{},"            row.append(matrix(i, j));\n",[20,330,332],{"class":22,"line":331},53,[20,333,165],{},[20,335,337],{"class":22,"line":336},54,[20,338,339],{},"        result.append(row);\n",[20,341,343],{"class":22,"line":342},55,[20,344,345],{},"    }\n",[20,347,349],{"class":22,"line":348},56,[20,350,351],{},"    return result;\n",[20,353,355],{"class":22,"line":354},57,[20,356,357],{},"}\n",[20,359,361],{"class":22,"line":360},58,[20,362,87],{"emptyLinePlaceholder":86},[20,364,366],{"class":22,"line":365},59,[20,367,286],{},[20,369,371],{"class":22,"line":370},60,[20,372,373],{},"\u002F\u002F 将 VectorXd 转换为 Python 列表\n",[20,375,377],{"class":22,"line":376},61,[20,378,379],{},"list vector_to_python_list(const VectorXd& vec) {\n",[20,381,383],{"class":22,"line":382},62,[20,384,304],{},[20,386,388],{"class":22,"line":387},63,[20,389,390],{},"    for (int i = 0; i \u003C vec.size(); ++i) {\n",[20,392,394],{"class":22,"line":393},64,[20,395,396],{},"        result.append(vec(i));\n",[20,398,400],{"class":22,"line":399},65,[20,401,345],{},[20,403,405],{"class":22,"line":404},66,[20,406,351],{},[20,408,410],{"class":22,"line":409},67,[20,411,357],{},[20,413,415],{"class":22,"line":414},68,[20,416,87],{"emptyLinePlaceholder":86},[20,418,420],{"class":22,"line":419},69,[20,421,422],{},"\u002F\u002F ==================== Eigen3 耗时任务函数 ====================\n",[20,424,426],{"class":22,"line":425},70,[20,427,87],{"emptyLinePlaceholder":86},[20,429,431],{"class":22,"line":430},71,[20,432,87],{"emptyLinePlaceholder":86},[20,434,436],{"class":22,"line":435},72,[20,437,438],{},"\u002F\u002F 大矩阵乘法 - 计算两个大矩阵的乘积（返回 Python 列表）\n",[20,440,442],{"class":22,"line":441},73,[20,443,444],{},"list matrix_multiply(int size) {\n",[20,446,448],{"class":22,"line":447},74,[20,449,450],{},"    MatrixXd A = MatrixXd::Random(size, size);\n",[20,452,454],{"class":22,"line":453},75,[20,455,456],{},"    MatrixXd B = MatrixXd::Random(size, size);\n",[20,458,460],{"class":22,"line":459},76,[20,461,462],{},"    MatrixXd C = A * B;\n",[20,464,466],{"class":22,"line":465},77,[20,467,468],{},"    return matrix_to_python_list(C);\n",[20,470,472],{"class":22,"line":471},78,[20,473,357],{},[20,475,477],{"class":22,"line":476},79,[20,478,87],{"emptyLinePlaceholder":86},[20,480,482],{"class":22,"line":481},80,[20,483,286],{},[20,485,487],{"class":22,"line":486},81,[20,488,87],{"emptyLinePlaceholder":86},[20,490,492],{"class":22,"line":491},82,[20,493,494],{},"\u002F\u002F 特征值分解 - 计算矩阵的所有特征值和特征向量（返回 Python 列表）\n",[20,496,498],{"class":22,"line":497},83,[20,499,500],{},"list compute_eigenvalues(int size) {\n",[20,502,504],{"class":22,"line":503},84,[20,505,450],{},[20,507,509],{"class":22,"line":508},85,[20,510,511],{},"    \u002F\u002F 使矩阵对称以确保实数特征值\n",[20,513,515],{"class":22,"line":514},86,[20,516,517],{},"    A = (A + A.transpose()) \u002F 2.0;\n",[20,519,521],{"class":22,"line":520},87,[20,522,523],{},"    SelfAdjointEigenSolver\u003CMatrixXd> solver(size);\n",[20,525,527],{"class":22,"line":526},88,[20,528,529],{},"    solver.compute(A);\n",[20,531,533],{"class":22,"line":532},89,[20,534,535],{},"    VectorXd eigenvalues = solver.eigenvalues();\n",[20,537,539],{"class":22,"line":538},90,[20,540,541],{},"    return vector_to_python_list(eigenvalues);\n",[20,543,545],{"class":22,"line":544},91,[20,546,357],{},[20,548,550],{"class":22,"line":549},92,[20,551,552],{}," \n",[20,554,556],{"class":22,"line":555},93,[20,557,558],{},"\u002F\u002F SVD 分解 - 奇异值分解（返回 Python 列表）\n",[20,560,562],{"class":22,"line":561},94,[20,563,564],{},"list compute_svd(int rows, int cols) {\n",[20,566,568],{"class":22,"line":567},95,[20,569,570],{},"    MatrixXd A = MatrixXd::Random(rows, cols);\n",[20,572,574],{"class":22,"line":573},96,[20,575,576],{},"    JacobiSVD\u003CMatrixXd> svd(A, ComputeThinU | ComputeThinV);\n",[20,578,580],{"class":22,"line":579},97,[20,581,582],{},"    VectorXd singular_values = svd.singularValues();\n",[20,584,586],{"class":22,"line":585},98,[20,587,588],{},"    return vector_to_python_list(singular_values);\n",[20,590,592],{"class":22,"line":591},99,[20,593,357],{},[20,595,597],{"class":22,"line":596},100,[20,598,87],{"emptyLinePlaceholder":86},[20,600,602],{"class":22,"line":601},101,[20,603,604],{},"\u002F\u002F 矩阵求逆 - 计算大矩阵的逆矩阵（返回 Python 列表）\n",[20,606,608],{"class":22,"line":607},102,[20,609,610],{},"list matrix_inverse(int size) {\n",[20,612,614],{"class":22,"line":613},103,[20,615,450],{},[20,617,619],{"class":22,"line":618},104,[20,620,621],{},"    \u002F\u002F 添加单位矩阵的倍数以确保矩阵可逆\n",[20,623,625],{"class":22,"line":624},105,[20,626,627],{},"    A += MatrixXd::Identity(size, size) * 0.1;\n",[20,629,631],{"class":22,"line":630},106,[20,632,633],{},"    MatrixXd inv = A.inverse();\n",[20,635,637],{"class":22,"line":636},107,[20,638,639],{},"    return matrix_to_python_list(inv);\n",[20,641,643],{"class":22,"line":642},108,[20,644,357],{},[20,646,648],{"class":22,"line":647},109,[20,649,87],{"emptyLinePlaceholder":86},[20,651,653],{"class":22,"line":652},110,[20,654,655],{},"\u002F\u002F 矩阵幂运算 - 计算矩阵的 n 次幂（返回 Python 列表）\n",[20,657,659],{"class":22,"line":658},111,[20,660,661],{},"list matrix_power(int size, int power) {\n",[20,663,665],{"class":22,"line":664},112,[20,666,450],{},[20,668,670],{"class":22,"line":669},113,[20,671,672],{},"    MatrixXd result = MatrixXd::Identity(size, size);\n",[20,674,676],{"class":22,"line":675},114,[20,677,678],{},"    for (int i = 0; i \u003C power; ++i) {\n",[20,680,682],{"class":22,"line":681},115,[20,683,684],{},"        result = result * A;\n",[20,686,688],{"class":22,"line":687},116,[20,689,345],{},[20,691,693],{"class":22,"line":692},117,[20,694,695],{},"    return matrix_to_python_list(result);\n",[20,697,699],{"class":22,"line":698},118,[20,700,357],{},[20,702,704],{"class":22,"line":703},119,[20,705,87],{"emptyLinePlaceholder":86},[20,707,709],{"class":22,"line":708},120,[20,710,711],{},"\u002F\u002F 线性方程组求解 - 求解 Ax = b（返回 Python 列表）\n",[20,713,715],{"class":22,"line":714},121,[20,716,717],{},"list solve_linear_system(int size) {\n",[20,719,721],{"class":22,"line":720},122,[20,722,450],{},[20,724,726],{"class":22,"line":725},123,[20,727,728],{},"    A += MatrixXd::Identity(size, size) * 0.1; \u002F\u002F 确保可逆\n",[20,730,732],{"class":22,"line":731},124,[20,733,734],{},"    VectorXd b = VectorXd::Random(size);\n",[20,736,738],{"class":22,"line":737},125,[20,739,740],{},"    VectorXd x = A.colPivHouseholderQr().solve(b);\n",[20,742,744],{"class":22,"line":743},126,[20,745,746],{},"    return vector_to_python_list(x);\n",[20,748,750],{"class":22,"line":749},127,[20,751,357],{},[20,753,755],{"class":22,"line":754},128,[20,756,87],{"emptyLinePlaceholder":86},[20,758,760],{"class":22,"line":759},129,[20,761,762],{},"\u002F\u002F 矩阵行列式计算\n",[20,764,766],{"class":22,"line":765},130,[20,767,87],{"emptyLinePlaceholder":86},[20,769,771],{"class":22,"line":770},131,[20,772,773],{},"double compute_determinant(int size) {\n",[20,775,777],{"class":22,"line":776},132,[20,778,450],{},[20,780,782],{"class":22,"line":781},133,[20,783,627],{},[20,785,787],{"class":22,"line":786},134,[20,788,789],{},"    return A.determinant();\n",[20,791,793],{"class":22,"line":792},135,[20,794,357],{},[20,796,798],{"class":22,"line":797},136,[20,799,87],{"emptyLinePlaceholder":86},[20,801,803],{"class":22,"line":802},137,[20,804,286],{},[20,806,808],{"class":22,"line":807},138,[20,809,810],{},"\u002F\u002F 矩阵的 Cholesky 分解（用于对称正定矩阵）（返回 Python 列表）\n",[20,812,814],{"class":22,"line":813},139,[20,815,816],{},"list cholesky_decomposition(int size) {\n",[20,818,820],{"class":22,"line":819},140,[20,821,450],{},[20,823,825],{"class":22,"line":824},141,[20,826,827],{},"    \u002F\u002F 构造对称正定矩阵\n",[20,829,831],{"class":22,"line":830},142,[20,832,833],{},"    A = A * A.transpose();\n",[20,835,837],{"class":22,"line":836},143,[20,838,627],{},[20,840,842],{"class":22,"line":841},144,[20,843,844],{},"    LLT\u003CMatrixXd> llt(A);\n",[20,846,848],{"class":22,"line":847},145,[20,849,850],{},"    MatrixXd L = llt.matrixL();\n",[20,852,854],{"class":22,"line":853},146,[20,855,856],{},"    return matrix_to_python_list(L);\n",[20,858,860],{"class":22,"line":859},147,[20,861,357],{},[20,863,865],{"class":22,"line":864},148,[20,866,286],{},[20,868,870],{"class":22,"line":869},149,[20,871,872],{},"\u002F\u002F 批量矩阵运算 - 执行多次矩阵乘法（返回 Python 列表）\n",[20,874,876],{"class":22,"line":875},150,[20,877,878],{},"list batch_matrix_operations(int size, int iterations) {\n",[20,880,882],{"class":22,"line":881},151,[20,883,672],{},[20,885,887],{"class":22,"line":886},152,[20,888,889],{},"    for (int i = 0; i \u003C iterations; ++i) {\n",[20,891,893],{"class":22,"line":892},153,[20,894,895],{},"        MatrixXd A = MatrixXd::Random(size, size);\n",[20,897,899],{"class":22,"line":898},154,[20,900,684],{},[20,902,904],{"class":22,"line":903},155,[20,905,345],{},[20,907,909],{"class":22,"line":908},156,[20,910,695],{},[20,912,914],{"class":22,"line":913},157,[20,915,357],{},[20,917,919],{"class":22,"line":918},158,[20,920,87],{"emptyLinePlaceholder":86},[20,922,924],{"class":22,"line":923},159,[20,925,87],{"emptyLinePlaceholder":86},[20,927,929],{"class":22,"line":928},160,[20,930,931],{},"\u002F\u002F 带时间测量的矩阵乘法（返回执行时间，单位：毫秒）\n",[20,933,935],{"class":22,"line":934},161,[20,936,937],{},"double timed_matrix_multiply(int size) {\n",[20,939,941],{"class":22,"line":940},162,[20,942,943],{},"    auto start = std::chrono::high_resolution_clock::now();\n",[20,945,947],{"class":22,"line":946},163,[20,948,450],{},[20,950,952],{"class":22,"line":951},164,[20,953,456],{},[20,955,957],{"class":22,"line":956},165,[20,958,462],{},[20,960,962],{"class":22,"line":961},166,[20,963,964],{},"    auto end = std::chrono::high_resolution_clock::now();\n",[20,966,968],{"class":22,"line":967},167,[20,969,970],{},"    auto duration = std::chrono::duration_cast\u003Cstd::chrono::microseconds>(end - start);\n",[20,972,974],{"class":22,"line":973},168,[20,975,976],{},"    return duration.count() \u002F 1000.0; \u002F\u002F 转换为毫秒\n",[20,978,980],{"class":22,"line":979},169,[20,981,357],{},[20,983,985],{"class":22,"line":984},170,[20,986,87],{"emptyLinePlaceholder":86},[20,988,990],{"class":22,"line":989},171,[20,991,286],{},[20,993,995],{"class":22,"line":994},172,[20,996,87],{"emptyLinePlaceholder":86},[20,998,1000],{"class":22,"line":999},173,[20,1001,1002],{},"\u002F\u002F ==================== Python 模块导出 ====================\n",[20,1004,1006],{"class":22,"line":1005},174,[20,1007,1008],{},"BOOST_PYTHON_MODULE(SharedMemoryModule) {\n",[20,1010,1012],{"class":22,"line":1011},175,[20,1013,1014],{},"    \u002F\u002F 原有的 SharedMemory 类\n",[20,1016,1018],{"class":22,"line":1017},176,[20,1019,1020],{},"    class_\u003CSharedMemory, boost::noncopyable>(\"SharedMemory\")\n",[20,1022,1024],{"class":22,"line":1023},177,[20,1025,1026],{},"        .def(\"increment\", &SharedMemory::increment);\n",[20,1028,1030],{"class":22,"line":1029},178,[20,1031,1032],{},"    \u002F\u002F Eigen3 耗时任务函数\n",[20,1034,1036],{"class":22,"line":1035},179,[20,1037,1038],{},"    def(\"matrix_multiply\", &matrix_multiply, \"Multiply two large matrices\");\n",[20,1040,1042],{"class":22,"line":1041},180,[20,1043,1044],{},"    def(\"compute_eigenvalues\", &compute_eigenvalues, \"Compute eigenvalues of a matrix\");\n",[20,1046,1048],{"class":22,"line":1047},181,[20,1049,1050],{},"    def(\"compute_svd\", &compute_svd, \"Compute SVD decomposition\");\n",[20,1052,1054],{"class":22,"line":1053},182,[20,1055,1056],{},"    def(\"matrix_inverse\", &matrix_inverse, \"Compute matrix inverse\");\n",[20,1058,1060],{"class":22,"line":1059},183,[20,1061,1062],{},"    def(\"matrix_power\", &matrix_power, \"Compute matrix power\");\n",[20,1064,1066],{"class":22,"line":1065},184,[20,1067,1068],{},"    def(\"solve_linear_system\", &solve_linear_system, \"Solve linear system Ax = b\");\n",[20,1070,1072],{"class":22,"line":1071},185,[20,1073,1074],{},"    def(\"compute_determinant\", &compute_determinant, \"Compute matrix determinant\");\n",[20,1076,1078],{"class":22,"line":1077},186,[20,1079,1080],{},"    def(\"cholesky_decomposition\", &cholesky_decomposition, \"Compute Cholesky decomposition\");\n",[20,1082,1084],{"class":22,"line":1083},187,[20,1085,1086],{},"    def(\"batch_matrix_operations\", &batch_matrix_operations, \"Perform batch matrix operations\");\n",[20,1088,1090],{"class":22,"line":1089},188,[20,1091,1092],{},"    def(\"timed_matrix_multiply\", &timed_matrix_multiply, \"Matrix multiplication with timing\");\n",[20,1094,1096],{"class":22,"line":1095},189,[20,1097,357],{},[10,1099,1103],{"className":1100,"code":1101,"language":1102,"meta":15,"style":15},"language-cmake shiki shiki-themes github-light github-dark","cmake_minimum_required(VERSION 3.10.0)\nproject(WindowsApiSolutions VERSION 0.1.0 LANGUAGES C CXX)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n  \nfind_package(fmt CONFIG REQUIRED)\nfind_package(Python3 COMPONENTS Interpreter Development REQUIRED)\nfind_package(Boost REQUIRED COMPONENTS system filesystem thread date_time python)\nfind_package(Eigen3 CONFIG REQUIRED)\n# Python 扩展模块是共享库\nadd_library(SharedMemoryModule SHARED src\u002Fmain.cpp)\nset_target_properties(SharedMemoryModule PROPERTIES\n    PREFIX \"\"\n    OUTPUT_NAME \"SharedMemoryModule\"\n    # Windows 上 Python 扩展应该使用 .pyd 扩展名\n    SUFFIX \".pyd\"\n    # 开启 DLL 聚合：自动导出所有符号（无需手动写 .def 文件）\n    CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON\n)\ntarget_include_directories(SharedMemoryModule PRIVATE ${Python3_INCLUDE_DIRS})\ntarget_link_libraries(SharedMemoryModule PRIVATE\n    fmt::fmt\n    Boost::boost\n    Boost::system\n    Boost::filesystem\n    Boost::thread\n    Boost::date_time\n    Boost::python\n    Eigen3::Eigen\n    ${Python3_LIBRARIES}\n)\n  \ninclude(CTest)\nenable_testing()\nset(CPACK_PROJECT_NAME ${PROJECT_NAME})\nset(CPACK_PROJECT_VERSION ${PROJECT_VERSION})\ninclude(CPack)\n","cmake",[17,1104,1105,1110,1115,1120,1125,1130,1134,1139,1144,1149,1154,1159,1164,1169,1174,1179,1184,1189,1194,1199,1204,1209,1214,1219,1224,1229,1234,1239,1244,1249,1254,1259,1263,1267,1272,1277,1282,1287],{"__ignoreMap":15},[20,1106,1107],{"class":22,"line":23},[20,1108,1109],{},"cmake_minimum_required(VERSION 3.10.0)\n",[20,1111,1112],{"class":22,"line":29},[20,1113,1114],{},"project(WindowsApiSolutions VERSION 0.1.0 LANGUAGES C CXX)\n",[20,1116,1117],{"class":22,"line":35},[20,1118,1119],{},"set(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n",[20,1121,1122],{"class":22,"line":41},[20,1123,1124],{},"set(CMAKE_CXX_STANDARD 20)\n",[20,1126,1127],{"class":22,"line":47},[20,1128,1129],{},"set(CMAKE_CXX_STANDARD_REQUIRED ON)\n",[20,1131,1132],{"class":22,"line":53},[20,1133,286],{},[20,1135,1136],{"class":22,"line":59},[20,1137,1138],{},"find_package(fmt CONFIG REQUIRED)\n",[20,1140,1141],{"class":22,"line":65},[20,1142,1143],{},"find_package(Python3 COMPONENTS Interpreter Development REQUIRED)\n",[20,1145,1146],{"class":22,"line":71},[20,1147,1148],{},"find_package(Boost REQUIRED COMPONENTS system filesystem thread date_time python)\n",[20,1150,1151],{"class":22,"line":77},[20,1152,1153],{},"find_package(Eigen3 CONFIG REQUIRED)\n",[20,1155,1156],{"class":22,"line":83},[20,1157,1158],{},"# Python 扩展模块是共享库\n",[20,1160,1161],{"class":22,"line":90},[20,1162,1163],{},"add_library(SharedMemoryModule SHARED src\u002Fmain.cpp)\n",[20,1165,1166],{"class":22,"line":96},[20,1167,1168],{},"set_target_properties(SharedMemoryModule PROPERTIES\n",[20,1170,1171],{"class":22,"line":102},[20,1172,1173],{},"    PREFIX \"\"\n",[20,1175,1176],{"class":22,"line":108},[20,1177,1178],{},"    OUTPUT_NAME \"SharedMemoryModule\"\n",[20,1180,1181],{"class":22,"line":114},[20,1182,1183],{},"    # Windows 上 Python 扩展应该使用 .pyd 扩展名\n",[20,1185,1186],{"class":22,"line":120},[20,1187,1188],{},"    SUFFIX \".pyd\"\n",[20,1190,1191],{"class":22,"line":126},[20,1192,1193],{},"    # 开启 DLL 聚合：自动导出所有符号（无需手动写 .def 文件）\n",[20,1195,1196],{"class":22,"line":132},[20,1197,1198],{},"    CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON\n",[20,1200,1201],{"class":22,"line":138},[20,1202,1203],{},")\n",[20,1205,1206],{"class":22,"line":144},[20,1207,1208],{},"target_include_directories(SharedMemoryModule PRIVATE ${Python3_INCLUDE_DIRS})\n",[20,1210,1211],{"class":22,"line":150},[20,1212,1213],{},"target_link_libraries(SharedMemoryModule PRIVATE\n",[20,1215,1216],{"class":22,"line":156},[20,1217,1218],{},"    fmt::fmt\n",[20,1220,1221],{"class":22,"line":162},[20,1222,1223],{},"    Boost::boost\n",[20,1225,1226],{"class":22,"line":168},[20,1227,1228],{},"    Boost::system\n",[20,1230,1231],{"class":22,"line":174},[20,1232,1233],{},"    Boost::filesystem\n",[20,1235,1236],{"class":22,"line":180},[20,1237,1238],{},"    Boost::thread\n",[20,1240,1241],{"class":22,"line":186},[20,1242,1243],{},"    Boost::date_time\n",[20,1245,1246],{"class":22,"line":192},[20,1247,1248],{},"    Boost::python\n",[20,1250,1251],{"class":22,"line":197},[20,1252,1253],{},"    Eigen3::Eigen\n",[20,1255,1256],{"class":22,"line":203},[20,1257,1258],{},"    ${Python3_LIBRARIES}\n",[20,1260,1261],{"class":22,"line":208},[20,1262,1203],{},[20,1264,1265],{"class":22,"line":214},[20,1266,286],{},[20,1268,1269],{"class":22,"line":220},[20,1270,1271],{},"include(CTest)\n",[20,1273,1274],{"class":22,"line":225},[20,1275,1276],{},"enable_testing()\n",[20,1278,1279],{"class":22,"line":231},[20,1280,1281],{},"set(CPACK_PROJECT_NAME ${PROJECT_NAME})\n",[20,1283,1284],{"class":22,"line":237},[20,1285,1286],{},"set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})\n",[20,1288,1289],{"class":22,"line":243},[20,1290,1291],{},"include(CPack)\n",[1293,1294,1295],"p",{},"stubgen -m SharedMemoryModule 工具得到pyi类型存根文件。",[1297,1298,1299],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":15,"searchDepth":29,"depth":29,"links":1301},[],"md",{},"\u002Fcpp\u002Fboost\u002F编译python可调用的pyd-c模块",{"description":15},"cpp\u002Fboost\u002F编译Python可调用的pyd-C模块","s_BGTEq6n-7jOG5aqDgNoepxppDbe6lxBFHqKrGXDE8",1791042461414]