Python vs. C++ vs. Rust

Pythonvs.C++vs.Rust

你可能会认为这是另一个比较 Python 与其他语言的博客,并试图让我们友好的 Python 士气低落,因为它是多么的慢和笨拙,对吧?

当然,与其他速度极快的语言相比,python 速度很慢。

Python就像......

但是,这里有一个问题,力量在于团结,不是吗?

如果我们利用其他语言的速度并将其转移到 python 中会怎样?

Keeeeep goooooing...。

那肯定会使python有点快。这就是我们这次将尝试做的事情。我们将为 python 制作 C++ 和 Rust 包装器并评估我们的速度。

我将在整个博客中使用 WSL

环境设置

  • 安装 Rust ,如果你在 wsl 上安装,只需运行以下命令
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | 嘘
  • 我们将创建一个 python 环境来维护依赖关系并安装 pybind11 ,它是 C++ 的包装器。我们还将安装 line_profiler 来评估我们的代码。
$ python3 -m venv .env 
$ source .env/bin/activate$ pip install pybind11 
$ pip install line_profiler
  • 注意 → 在 .env 激活时运行以下所有命令
  • 接下来我们要做的是设置我们的 Rust 包装器,我们将使用 Py03 (相当于 pybind11,但用于 rust)。
$ mkdir rust_wrapper 
$ cd rust_wrapper$ maturin init 
(注意--> 运行上述命令后选择 py03 作为绑定)

毕竟,我们的文件夹结构将如下所示:

Pythonvs.C++vs.Rust

现在,问题是,我们将在什么基础上比较这些包装器?

我将尝试在称为插入排序的排序算法上比较这些。您可以单击以下 链接 以了解更多信息。

  • 但是我们需要很多数字来排序。我们将使用 python random 函数生成一个随机数的 txt 文件。

随机生成器.py

运行此脚本后,我们生成一个名为 randomNumbers.txt 的文件

  • 接下来我们将创建一个用于插入排序的python函数

python_self.py

  • 接下来我们将创建一个用于插入排序的 C++ 函数

cpp_wrapper.cpp

让我们看看这里发生了什么:

  • 第 1 → 6 行:导入标头
  • 第 8 → 25 行:定义函数
  • 第 27 行:定义 pybind11 模块,我们将 cpp_wrapper 作为模块名称,并将 m 作为对其的引用
  • 第 28 行:为模块定义文档(形式)
  • 第 29 行:在模块中定义函数
  • 接下来我们将创建一个用于插入排序的 Rust 函数,因此进入 rust_wrapper/src/lib.rs 并使用以下内容进行更新:

rust_wrapper/src/lib.rs

让我们看看这里发生了什么:

  • 第 1 → 3 行:进口
  • 第 6 → 18 行:定义函数
  • 第 22 行:定义 rust_wrapper 模块,其中 m 引用 PyModule(类似于 pybind11)
  • 第 23 行:我们使用 wrap_pyfunction 检查向这个模块添加一个名为 insert_sort 的函数。

呜呜呜!!!那是很多新代码。让我们休息 45 秒,让它在我们的大脑中休息。

即使是像你这样的英雄也需要休息,冷静一点

现在几乎所有的东西都准备好了。但是我们仍然需要运行一些命令来为cpp和rust生成 .so文件,然后最终可以被 python 使用。

  • 要生成 cpp 包装器,请在根目录中运行以下命令
$ c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) cpp_wrapper.cpp -o cpp_wrapper$(python3-config --extension-suffix)
  • 将 rust wrapper cd 生成到 rust_wrapper 目录并运行以下命令
$成熟素开发
  • 现在我们终于创建了一个用于测试的python脚本

python_benchmark.py

上面脚本中唯一新的部分是函数装饰器“@profile”,它实际上定义了我们需要通过 line_profiler 运行测试的函数。

现在我们的文件夹结构应该如下所示:

Pythonvs.C++vs.Rust

现在我们最终评估我们的结果,运行以下命令以生成 .lprof 报告

& kernprof -l python_benchmark.py

现在要实际查看此报告,请运行以下命令

$ python -m line_profiler python_benchmark.py.lprof

并且会得到类似下面的东西

Pythonvs.C++vs.Rust

结果

那么我们可以清楚地看到墙上的时间顺序是 cpp < rust < python

注意 → 这个测试是在 9800 个随机数上完成的。

上面有一些不熟悉的命名法,我们可以从下面的备忘单中理解:

那么我们可以从这个小实验中得出什么结论呢?

是的,Python 很慢,但这并不意味着您的代码必须很慢。您可以使用这些不同的开源包装器来使其速度极快。我的意思是已经有了 PyPy,但我们仍然可以灵活使用 。

蟒蛇现在!!

这次就是这样,你会很快见到你很酷的东西吗!

再见,保重!!

是的,这里是这个实验的 GitHub 存储库的 链接。