性能测试对比

计算“斐波那契数列”的第 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)

测试结果

> python3 test-fib-speed.py 

C++ 计算的结果为    102334155 总的耗时 0:00:00.306884(s)
Python 计算的结果为 102334155 总的耗时 0:00:13.995322(s)