性能测试对比
计算“斐波那契数列”的第 n 位来测试对比性能
C++ 部分的代码
// plugins/cppmath.cpp
#include <Python.h>
// 用 C++ 实现 fib 函数
int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return fib(n - 1) + fib(n - 2);
}
}
// 把 C/C++ 的一个函数包装成一个 Python 函数
static PyObject *py_fib(PyObject *self,PyObject *args)
{
int x = 0,result = 0;
PyArg_ParseTuple(args,"i",&x);
result = fib(x);
return Py_BuildValue("i",result);
}
// 定义模块要包含的函数列表
static PyMethodDef methods[] = {
{"fib", py_fib, METH_VARARGS, "fib"},
{0,0,0,0}
};
// 定义模块
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"plugins",
"extend cpython",
-1,
methods
};
// 定义模块的初始化方法
PyMODINIT_FUNC PyInit_cppmath(void)
{
return PyModule_Create(&module);
}
编译 C++ 代码
cd plugins
g++ -shared -Wl,-soname,cppmath \
-I/root/.pyenv/versions/3.10.9/include/python3.10 \
-o cppmath.so -fPIC cppmath.cpp
Python 部分的代码
# /usr/bin/env python3
"""
测试 Python & C++ 这两种语言计算 斐波那契数列 的快慢。
"""
from datetime import datetime
from plugins import cppmath
def fib(n):
"""求 斐波那契数列 的第 n 位的值
Parameter:
----------
n: int
第 n 位
Return:
-------
int
返回斐波那契数列第 n 位的值
"""
if n == 1 or n == 2:
return 1
else:
return fib(n - 1) + fib(n - 2)
def main(n):
"""分别测试 C++ 和 Python 计算同一个数的耗时"""
start = datetime.now()
res = cppmath.fib(n)
end = datetime.now()
print("C++ 计算的结果为 {} 总的耗时 {}(s)".format(res, end - start))
start = datetime.now()
res = fib(n)
end = datetime.now()
print("Python 计算的结果为 {} 总的耗时 {}(s)".format(res, end - start))
if __name__ == "__main__":
main(40)
测试结果