CMake 管理 Python 调用 C++ 实现 Fibonacci
CMake 管理 Python 调用 C 实现 Fibonacci源码已经发布 GitHub Click Me这个示例演示如何用 C 编写 Fibonacci 函数并通过 Python 原生扩展模块的方式在 Python 中调用。构建完成后Python 可以这样使用importfibonacci_cppprint(fibonacci_cpp.fibonacci(10))# 55一、环境配置需要安装Python 3.xCMake 3.18 或更高版本一个可用的 C17 编译器例如 MinGW、MSVC 或 Clang确认命令可用python--version cmake--version g--version注意Python 扩展模块必须使用同一个 Python 版本来构建和运行。本项目的 CMake 会优先选择当前命令行 PATH 中的python这样cmake --build build生成的模块可以直接被python main.py导入。如果你想指定某个 Python 解释器可以这样配置cmake-S.-B build-DPython_EXECUTABLEC:\Users\你的用户名\miniconda3\python.exe二、构建 C 扩展模块在项目根目录运行cmake-S.-B build cmake--build build构建成功后build目录里会生成类似下面的文件fibonacci_cpp.cp313-win_amd64.pyd文件名中的 Python 版本号可能不同这是正常的。例如cp313表示 CPython 3.13。CMakeLists.txt的核心配置是find_package(Python REQUIRED COMPONENTS Interpreter Development.Module) add_library(fibonacci_cpp MODULE src/fibonacci.cpp ) target_link_libraries(fibonacci_cpp PRIVATE Python::Module)这里生成的模块名是fibonacci_cpp所以 Python 中使用import fibonacci_cpp。三、Python 调用方式src/fibonacci.cpp使用 Python C API 暴露了一个函数fibonacci_cpp.fibonacci(n)参数说明n必须是非负整数。返回值是 Python 的int所以结果可以是大整数。C 侧当前把n解析为unsigned long long因此索引n最大支持18446744073709551615但实际可计算大小还取决于内存和时间。运行示例python main.py你也可以传入更大的 npython main.py 1000000四、Wall Time 性能测试main.py会做两件事先打印fibonacci_cpp.fibonacci(0)到fibonacci_cpp.fibonacci(10)的小规模结果。再对比纯 Python 版本和 C 扩展版本计算同一个大数时消耗的 Wall Time。默认测试n 100000python main.py在当前机器上的一次结果如下Benchmark n 100,000 Result decimal digits : 20,899 Python Wall Time : 0.052376 s C Wall Time : 0.000816 s Speedup : 64.18x测试n 1000000python main.py 1000000在当前机器上的一次结果如下Benchmark n 1,000,000 Result decimal digits : 208,988 Python Wall Time : 4.540529 s C Wall Time : 0.033997 s Speedup : 133.56x不同机器、Python 版本、编译器和后台负载都会影响 Wall Time所以这些数字只作为参考。更严谨的性能评估可以多运行几次取平均值或者使用pyperf这类专业工具。五、为什么 C 实现更有优势C 扩展适合放置计算密集型热点代码。在这个例子里收益主要来自Python 版本使用直观循环实现每一步都要经过 Python 字节码解释和变量绑定。C 扩展把热点逻辑下沉到编译后的模块中减少 Python 层循环开销。C 版本使用快速倍增法能用大约O(log n)次大整数运算计算 Fibonacci比普通循环的O(n)次迭代更适合大 n。Python 仍然负责调用入口和结果展示C 负责重计算部分可以兼顾开发效率和性能。也要注意不是所有代码改成 C 都会更快。跨语言调用本身有成本适合下沉到 C 的通常是计算密集、调用次数可控、逻辑相对稳定的部分。六、Python C API 学习链接Python 官方教程Extending and Embedding the Python Interpreterhttps://docs.python.org/3/extending/Python 官方参考Python/C API Reference Manualhttps://docs.python.org/3/c-api/index.htmlReal Python 教程Building a Python C Extension Modulehttps://realpython.com/build-python-c-extension-module/如果后续想用更现代的 C 封装方式也可以了解 pybind11https://pybind11.readthedocs.io/