rust门卡有什么用_屠龙之技! 使用Rust加速你的Python
屠龙之技! 使用Rust加速你的Python
zhangy233 • 2020 年 09 月 11 日
前言
默认读者已经习得 rust基础相关, 且掌握python基础语法
资料不多, 我也是小试牛刀
测试结果有一点疑问, 在长度越长的时候,使用指针操作数组,速度反而下降
函数参数做成泛型, 当在动态运行语言中运行的时候,性能较i32下降 3%(应该是打包so时编译器无法优化), 这里使用了 i32
1. 配置编译环境
1.1 创建rust模块cargo new handle --lib
1.2 添加相应包// Cargo.toml 添加
[lib]
name = "handle" // python中导入的名字,这里注意要和我们打包后的文件名一致
crate-type = ["cdylib"]
[dependencies.cpython] // rust打包python支持的so主要库
version = "0.5.*"
features = ["extension-module"]
2. rust代码实现// lib.rs
use cpython::{PyResult, Python, py_module_initializer, py_fn, PyList, PyObject, PyDict};
// 注意此处名称和文件名统一
py_module_initializer!(handle, |py, m| {
m.add(py, "__doc__", "This module is implemented in Rust.")?;
m.add(py, "sum_as_string", py_fn!(py, sum_as_string_py(a: i64, b:i64)))?; // 注册
m.add(py, "bubble1", py_fn!(py, bubble1(li:Vec)))?; // 注册
m.add(py, "bubble2", py_fn!(py, bubble2(li:Vec)))?; // 注册
Ok(())
});
fn sum_as_string(a:i64, b:i64) -> String { //
format!("{}", a + b).to_string()
}
fn sum_as_string_py(_: Python, a:i64, b:i64) -> PyResult {
let out = sum_as_string(a, b);
Ok(out)
}
// 做成泛型, 当在动态运行语言中运行的时候,性能较i32下降 3%(应该是打包so时编译器无法优化), 这里使用了 i32
fn bubble1(py: Python, mut li:Vec) -> PyResult>
{
let n = li.len();
for i in 0..n{
for j in 0..(n-i-1) {
if li[j] > li[j+1]{
let temp = li[j + 1];
li[j + 1] = li[j];
li[j] = temp;
}
}
}
Ok(li)
}
fn bubble2(py: Python, mut li:Vec) -> PyResult>
{
let li = &mut li;
let n = li.len();
for i in 0..n {
for j in 0..(n - i - 1) {
if li[j] > li[j + 1] {
let temp = li[j + 1];
li[j + 1] = li[j];
li[j] = temp;
}
}
};
Ok(li.to_vec())
}
2.1 buildcd handle
cargo build --release
cd target/release
mv ./libhandle.dylib ./handle.so // 注意编译之后需要手动重命名(!mac后缀为dylib需要改为so, win上为dll需要改为pyd)
python相关代码
条件: 长度1w 其内元素类型为i32类型的数组, 冒泡排序10次import random
import time
# 此处默认py文件和编译且改名后的handle文件在同一目录
from handle import bubble2,bubble1
def get_li():
li = []
for i in range(10000):
li.append(random.randint(1, 100))
return li
def bubbleSort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
li = get_li()
st = time.perf_counter()
for i in range(10):
bubbleSort(li)
print(time.perf_counter() - st)
li = get_li()
st = time.perf_counter()
for i in range(10):
bubble1(li)
print(time.perf_counter() - st)
li = get_li()
st = time.perf_counter()
for i in range(10):
bubble2(li)
print(time.perf_counter() - st)python: 46.073884827
rust bubble1: 0.5787298269999965
rust bubble2: 0.9453265779999995
Demo文件
rust门卡有什么用_屠龙之技! 使用Rust加速你的Python相关推荐
- rust门卡有什么用_有种尴尬叫忘带门禁卡,那么如何用手机NFC功能代替门卡呢?...
引语: 相信很多朋友或多或少都会遇到出门急导致门禁卡忘记带了,然后回来的时候就要找相应人员开门,或者向保卫说明情况确认自己就是里面的住户才行,虽然时间不是太长但总归不方便.可是门禁卡我们有时候总是会不 ...
- rust门卡有什么用_地球末日门禁卡A卡 | 手游网游页游攻略大全
发布时间:2015-10-09 炉石传说末日手牌术卡组打法介绍,炉石传说游戏中术士职业一直十分稳定.大家也是偏爱用动物园卡组!小编为大家带来一套末日手牌术卡组. 只是从卡组构成看,你很可能就简单的理解 ...
- rust门卡有什么用_Rust能力养成之(10)用Cargo进行项目管理:扩展 调用与优化
前言 上一篇我们讲了Cargo运行测试 Cargo运行实例 Cargo工作空间 当然,Cargo也能够进行扩展,合并外部工具以增强开发体验,在设计上,其可扩展性已经达到非常丰富和恰当的程度.Cargo ...
- python for循环加速_干货总结,24招加速你的Python代码,值得收藏
一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第3式,按调用函数分析代码运行时间 ...
- 小米门卡协议加载失败_小米门禁卡没反应怎么回事
小米手机MIUI9开发版上线了模拟门禁卡功能,米粉们都非常兴奋,跃跃欲试,但是也出现了小米门禁卡没反应,小米门禁卡无法识别等问题,小米门禁卡没反应怎么回事呢?本文为大家带来了小米门禁卡nfc功能的详细 ...
- cuid卡写入后锁死_荣耀手机NFC升级了:公交、门禁、支付、饭卡、加密卡还能写卡...
2019年双十一期间,入手了荣耀magic2手机,其实去年用过一次,今年换了多次还是特别喜欢,主要是麒麟980旗舰CPU,全面滑屏特有面子. 入手的第一时间,自己就启用了手机的钱包功能,手机钱包除了小 ...
- 小米手环无法模拟门卡_颜值与功能得到全面升级,小米手环4 NFC版上手体验
提到国产智能手环,相信不少人第一时间想到的就是小米手环系列,就在前不久的时候,小米米家正式举办了新品发布会,而小米手环4系列也正式登场. 与前代产品相比,小米手环4系列在很多方面都进行了全面升级,比如 ...
- 小米门卡协议加载失败_小米手机门禁卡空白卡开通步骤及写入激活方法
小米支持NFC功能的手机都是可以设置门禁卡的,通过写入空白卡来进行设置,最后可以很便捷的将手机作为门禁卡使用.小米空白卡开通后是需要拿到物业处进行激活才能使用的,不过很多小伙伴还不了解操作的步骤,小米 ...
- 小米手环无法模拟门卡_小米手环3门禁卡设置方法 居然可以模拟门禁卡
这个智能家居快速发展的时代里面,越来越多的产品向智能靠拢.除了智能音箱引领潮流之外,智能穿戴产品也占据了下一个风口浪尖.不管是智能手表还是智能手环,都是年轻人的必备品,下面就来给的大家介绍一下小米手环 ...
最新文章
- [android]am自动化测试框架(原创)
- 全国计算机二级计基础题第十五套,2014计算机二级VF试题及答案解析(第十五套)...
- RMAN-06214问题处理
- python数据分析方法五种_加速Python数据分析的10个简单技巧(上)
- 最简方式 表格编辑 基于 el-table
- 最优化课堂笔记06-无约束多维非线性规划方法(续)
- Centos7.3 格式化和挂载数据盘
- CodeForces - 1610B Kalindrome Array
- SQL中JOIN操作后接ON和WHERE关键字的区别
- 扇贝有道180914每日一句
- 数学建模与数学实验3.4习题1
- 图像处理笔记——边缘检测算子
- 《当代教育心理学》(第2版)学习笔记
- python excel条件格式_Python操作Excel学习笔记(28):条件格式
- 内容创业洗稿,知识付费拆书
- 华为服务器故障灯不开机_华为手机开不了机指示灯亮,怎么办
- android检测cup温度工具,android – 如何获得CPU温度?
- 前端开发——Vue 监听组件生命周期
- php 验证手机号邮箱,PHP正则验证真实姓名、手机号码、邮箱
- 聊聊办公室装修适合哪些风格以及装修技巧