使用Rust加速Python,,https://jo
使用Rust加速Python,,https://jo
https://josephok.github.io/2019/03/30/Speed-up-Python-program-with-Rust/
Python具有开发快速的特点,但是在运行效率上比静态编译型语言慢不少,我们今天要介绍的Rust就是其中一种。
Rust是一种安全、并发、实用的编程语言,有着惊人的运行速度,能够防止段错误,并保证线程安全,使每个人都能够构建可靠、高效的软件。
当我们的Python程序出现性能瓶颈时,可以从如下几个方面优化:
优化算法,使用更高效率的算法来提升性能;使用并发,如多线程程序;使用编译型语言编写扩展;优化网络、磁盘、数据库等。性能优化是个大命题,我们需要从多个方面着手考虑,今天我介绍的是第3种方法,并且选择Rust语言。我们将编写一个so扩展供Python端调用。
这里不会讲Rust的入门,具体规范可以看官方文档或者中文文档:https://rustlang-cn.org/
我们选择Httpbin作为基准程序,进行修改然后对比效果。
1. 原始代码
为了简单,我稍微修改了view_get,使之只返回客户端的请求方法。如下:
1 | { |
代码如下:
1 | # httpbin/core.py |
2. 测试一下原始代码性能:
使用wrk进行benchmark测试:
1 | wrk http://127.0.0.1:5000/get -c 400 -t 10 |
可以看出:平均时延为315ms左右,RPS为434左右。
3. 使用rust-cpython编写扩展
首先新建一个lib类型的项目,比如名字为handle:
1 | cargo new handle --lib |
这样就在当前项目下新建了一个目录:handle,我们需要编辑handle/Cargo.toml:
1 | [package] |
然后是编辑handle/src/lib.rs:
1 | #[macro_use] |
这里的handle是模块名,ret_py_dict就是模块的方法,供Python调用,使用方法:
1 | import handle |
然后需要编译此模块,我们使用Makefile编写编译规则:
1 | build: |
执行make命令编译并将so文件拷贝到指定目录。
4.Python端调用方法
编写一个view_get1方法:
1 | from . import handle |
与我们的原始函数唯一区别是:jsonify函数的参数,即响应内容是由扩展模块产生,类型都是dict。
curl响应为:
1 | curl localhost:5000/get1 |
结果一致。
5. 测试使用了扩展的性能
1 | wrk http://127.0.0.1:5000/get1 -c 400 -t 10 |
可以看出:平均时延为248ms左右,RPS为544左右。
比原始版本:时延低70ms,RPS高110,效果比较明显,这里仅仅改写了获取对象属性的方式。
6. 总结
如果想继续优化,可以考虑改写jsonify函数。在这里我们提出了一个优化Python程序性能(Latency, RPS)的方案。前文也说到过,优化性能应该先从代码结构、算法方面做优化,当语言成为瓶颈时,使用Rust编写扩展实为一种好的方式。
参考:
https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust/
使用Rust加速Python
相关内容
- 深度学习“四大名著”发布!Python、TensorFlow、机器学习
- Python接口自动化之Token详解及应用,,在上一篇Python
- python的JSON库,, JSON(Jav
- Python 字符串格式化%与format() 函数 九,,这是12月规划的
- 大四学长手把手教我们从零开始利用Python开发微信公众
- Python 语法练习题,,001、string
- python 中画子图的两种方式,,add_subplo
- Pyinstaller打包生成exe文件过大,四种常用处理方法集锦
- python--Selenium(动态渲染页面爬取),,上一节,学习了
- 人生第一个python脚本:从数据库查询数据并发送邮件,
评论关闭