背景

  1. 之前都是在看C/Cpp,也在努力的学这两个语言。但是感觉太难了。语法太多了(主要还是人笨,学不过来)。
  2. 一直也在看rust,感觉rust写起来和python差不多优雅,而且写法和c++又是有点类似。
  3. 然后最近空闲时间就把《Rust程序设计语言》和《通过例子学Rust》两本书看完了。学到了不少新内容。
  4. 最近也发现一些新的包,比如一个叫polar包的,提供类pandas的功能,但是比pandas更快,这个包的底层是使用rust写的,并且python也能使用。那我就在想:“我能不能学习一下,看看怎么让python用rust编译的东西,或者说,如果使用rust加速python。” 这篇文章主要就是介绍一个简单的rust加速python的案例。(主要是翻译,原文已放在文末的参考链接中)。

步骤

创建一个rust包

cargo new pyext-myrustlib

然后使用vscode进入这个文件夹下,打开src文件夹,创建一个新文件:lib.rs

编辑Cargo.toml

  1. 依赖的是rust-cpython。当前版本是0.7(2022年4月)。
  2. 输出的是一个dylib。这个可以让python直接import。
[package]
name = "pyext-myrustlib"
version = "0.1.0"
edition = "2021"[lib]
name="myrustlib"
crate-type=["dylib"][dependencies.cpython]
version="0.7"
features=["extension-module"]

编写src/lib.rs

  1. cpython导入宏。
  2. 调用Python,PyResult
  3. 构建一个count_doubles函数。
  • 3.1 这个函数第一个参数是Python,是对python解释器的引用,可以让rust使用python的GIL。
  • 3.2 函数的第二个参数是val,是一个字符串的引用。
  • 3.3 返回的对象是PyResult。即使到时候有异常,也可以让这个函数报错。
  • 3.4 更多的细节,其实可以看看rust官网上两本书。
  1. 使用宏py_module_initializer!给这个lib注册一个新的属性。比如这里就是给count_doubles函数添加了一个函数文档。
#[macro_use]
extern crate cpython;use cpython::{Python, PyResult};fn count_doubles(_py:Python, val:&str) -> PyResult<u64>{let mut total = 0u64;// there is an imporved version later on this postfor (c1, c2) in val.chars().zip(val.chars().skip(1)) {if c1 == c2 {total += 1;}}Ok(total)
}py_module_initializer!(libmyrustlib, initlibmyrustlib, PyInit_myrustlib, |py, m | {m.add(py, "__doc__", "This module is implemented in Rust")?;m.add(py, "count_doubles", py_fn!(py, count_doubles(val: &str)))?;Ok(())
});

build

  1. build一下
cargo build --release
  1. 看输出的结果

build后,会产生一个文件:

ls -la target/release/libmyrustlib*

看到上面的结果,就知道,这个时候已经生成了sod格式的文件。

接下来,把这个so结尾的文件复制到一个新的文件夹中。

我就是把这个so结尾的文件放在了mypythoncode文件夹中。

运行python

我在mypythoncode文件夹,还创建了doubles.py文件,用来做评测。这个文件的代码如下:

import re
import string
import random
import libmyrustlib   #  <-- 这里就是我们要import的rust的打包后的文件 (libmyrustlib.so)def count_doubles(val):"""Count repeated pair of chars ins a string"""total = 0for c1, c2 in zip(val, val[1:]):if c1 == c2:total += 1return totaldouble_re = re.compile(r'(?=(.)\1)')def count_doubles_regex(val):return len(double_re.findall(val))val = ''.join(random.choice(string.ascii_letters) for i in range(1000000))def test_pure_python(benchmark):benchmark(count_doubles, val)def test_regex(benchmark):benchmark(count_doubles_regex, val)def test_rust(benchmark):   #  <-- 测试rust打包的函数的速度benchmark(libmyrustlib.count_doubles, val)

接下来我们比较各个函数的运行效率。
如果没有安装pytest。需要先安装一下,不然python程序跑不起来:pip install pytest-benchmark.

benchmark

mypythoncode文件夹下,运行:

pytest doubles.py

在mean这一列,会发现rust写的函数运行时间python写的函数运行时间的1/25倍左右。差距非常大。

注意事项:⚠️

  1. 本文不是一个比较性能的文章。因此上面的运行效率参考可能没什么价值,实际上,如果使用numpy计算的话,时间应该是rust版本的2倍。而不是25倍。
  2. 大家最好看一下原作者的内容【在参考链接[1] 中】. 原作者中一下代码和依赖的版本和现在不一样了,如果要说看代码部分,看我这个部分就行了。

参考链接

  1. https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust#edit_cargo_toml
  2. https://crates.io/crates/cpython
  3. https://pypi.org/project/pytest-benchmark/

感悟

  1. 目前还在学习rust中,只是把《Rust程序设计语言》和《通过例子学Rust》两本书看完了,代码都敲了一遍。说实话,还是非常喜欢这个语言的。感觉大部分代码写法和python差不多。后面应该还是会继续深入学习。
  2. 未来会继续把时间投资在pythonrust上。学习算法、学习科学计算。

rust加速python相关推荐

  1. rust门卡有什么用_屠龙之技! 使用Rust加速你的Python

    屠龙之技! 使用Rust加速你的Python zhangy233 • 2020 年 09 月 11 日 前言 默认读者已经习得 rust基础相关, 且掌握python基础语法 资料不多, 我也是小试牛 ...

  2. 使用PyO3从Python调用 Rust:加速Python

    使用 Rust 加速你的 Python: PyO3使从 Python 调用 Rust 代码变得容易.您可以编写 Rust 库,并依靠 PyO3 和生态系统中maturin的支持工具的组合PyO3来编译 ...

  3. 用PyPy加速Python程序

    用PyPy加速Python程序 在<Python性能优化指南–让你的Python代码快x3倍的秘诀>中有提到,我们可以用更好的Python运行环境或运行时优化来提升Python的速度,其中 ...

  4. python找不到reshape_如何加速Python程序

    这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即时编译,达到高性能,另外也可以使用cuda GPU的计算能力来加速,对python来 ...

  5. matlab简单程序实例_【简单实例】如何使用C++加速python程序

    C++党最鄙视Python的两个原因: 1,计算速度太慢: 2,动态语言特性. 对于第2个原因,这需要python程序员好好规范自己的编写习惯,加深对语言和系统的理解.其实作为动态语言的python依 ...

  6. python sum函数numpy_如何用numba加速python?

    我把写好的markdown导入进来,但是没想到知乎的排版如此感人.如果对知乎排版不满想要看高清清爽版,请移步微信公众号原文 如何用numba加速python?同时欢迎关注 前言 说道现在最流行的语言, ...

  7. cython python3_30倍!使用Cython加速Python代码

    原标题:30倍!使用Cython加速Python代码 作者:George Seif.Thomas Wolf.Lukas Frei 编译:1+1=6 | 公众号海外部 前言 你可能经常会一次又一次地听到 ...

  8. python numba_如何用numba加速python?

    我把写好的markdown导入进来,但是没想到知乎的排版如此感人.如果对知乎排版不满想要看高清清爽版,请移步微信公众号原文 如何用numba加速python?同时欢迎关注 前言 说道现在最流行的语言, ...

  9. Taichi 加速 Python 中图像处理

    Taichi 咱来说一说哈 在计算机视觉(特别是深度学习图片预处理.模型训练)等复杂度较高,技术迭代速度快的领域,用 Python 快速开发出算法原型.验证效果是许多研发人员的首选方案.著名图像处理库 ...

最新文章

  1. c 语言epc编码如何解开,EPC编码结构
  2. 理解进程调度时机跟踪分析进程调度与进程切换的过程
  3. php熊掌号怎么设置json-ld,dedecms织梦系统怎么对接百度熊掌号并添加JSON_LD数据
  4. 使用JDBC连接数据库(MySQL)的源代码
  5. Python Pytest装饰器@pytest.mark.parametrize详解
  6. html5离线缓存使用
  7. 无问西东,哪怕重头来过
  8. 当信贷风控遇见机器学习,模型还是规则?
  9. java的两种核心机制(一)
  10. 头歌MySQL数据库
  11. Visual Studio 2019 操作使用
  12. 深入理解 OpenStack Neutron:VXLAN
  13. 电脑右击新建没有Word、Excel怎么办
  14. TC397 STM(System Timer)
  15. C专家编程 一 KR C
  16. windows认证之域认证:Kerberos协议认证
  17. 2020遥感应用组二等奖:基于LiDAR和资源三号数据的广西高峰林场森林资源三维动态监测
  18. 哈希密码_哈希生日和密码
  19. List的Sort 函数CompareTo升序降序排序
  20. 三菱HMI工具E-Designer远程执行代码

热门文章

  1. Python爬虫 BeautifulSoup(bs4)-- bs4介绍、安装bs4、bs4基础语法
  2. KPW3 MEMORY ERROR维修直播
  3. 量化交易都有哪些主要的策略模型?
  4. 怎样才能在技术领域走的更远?
  5. 1793D Moscow Gorillas
  6. hbase热点问题解决(预分区)
  7. 第一章计算机系统基础知识,计算机系统基础知识 第一章(未完待续)
  8. 十分钟快速DIY简易FM电台和收音机
  9. aslkjdkkjas
  10. 电脑系统管理员权限怎么设置为超级管理员权限