屠龙之技! 使用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相关推荐

  1. rust门卡有什么用_有种尴尬叫忘带门禁卡,那么如何用手机NFC功能代替门卡呢?...

    引语: 相信很多朋友或多或少都会遇到出门急导致门禁卡忘记带了,然后回来的时候就要找相应人员开门,或者向保卫说明情况确认自己就是里面的住户才行,虽然时间不是太长但总归不方便.可是门禁卡我们有时候总是会不 ...

  2. rust门卡有什么用_地球末日门禁卡A卡 | 手游网游页游攻略大全

    发布时间:2015-10-09 炉石传说末日手牌术卡组打法介绍,炉石传说游戏中术士职业一直十分稳定.大家也是偏爱用动物园卡组!小编为大家带来一套末日手牌术卡组. 只是从卡组构成看,你很可能就简单的理解 ...

  3. rust门卡有什么用_Rust能力养成之(10)用Cargo进行项目管理:扩展 调用与优化

    前言 上一篇我们讲了Cargo运行测试 Cargo运行实例 Cargo工作空间 当然,Cargo也能够进行扩展,合并外部工具以增强开发体验,在设计上,其可扩展性已经达到非常丰富和恰当的程度.Cargo ...

  4. python for循环加速_干货总结,24招加速你的Python代码,值得收藏

    一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第3式,按调用函数分析代码运行时间 ...

  5. 小米门卡协议加载失败_小米门禁卡没反应怎么回事

    小米手机MIUI9开发版上线了模拟门禁卡功能,米粉们都非常兴奋,跃跃欲试,但是也出现了小米门禁卡没反应,小米门禁卡无法识别等问题,小米门禁卡没反应怎么回事呢?本文为大家带来了小米门禁卡nfc功能的详细 ...

  6. cuid卡写入后锁死_荣耀手机NFC升级了:公交、门禁、支付、饭卡、加密卡还能写卡...

    2019年双十一期间,入手了荣耀magic2手机,其实去年用过一次,今年换了多次还是特别喜欢,主要是麒麟980旗舰CPU,全面滑屏特有面子. 入手的第一时间,自己就启用了手机的钱包功能,手机钱包除了小 ...

  7. 小米手环无法模拟门卡_颜值与功能得到全面升级,小米手环4 NFC版上手体验

    提到国产智能手环,相信不少人第一时间想到的就是小米手环系列,就在前不久的时候,小米米家正式举办了新品发布会,而小米手环4系列也正式登场. 与前代产品相比,小米手环4系列在很多方面都进行了全面升级,比如 ...

  8. 小米门卡协议加载失败_小米手机门禁卡空白卡开通步骤及写入激活方法

    小米支持NFC功能的手机都是可以设置门禁卡的,通过写入空白卡来进行设置,最后可以很便捷的将手机作为门禁卡使用.小米空白卡开通后是需要拿到物业处进行激活才能使用的,不过很多小伙伴还不了解操作的步骤,小米 ...

  9. 小米手环无法模拟门卡_小米手环3门禁卡设置方法 居然可以模拟门禁卡

    这个智能家居快速发展的时代里面,越来越多的产品向智能靠拢.除了智能音箱引领潮流之外,智能穿戴产品也占据了下一个风口浪尖.不管是智能手表还是智能手环,都是年轻人的必备品,下面就来给的大家介绍一下小米手环 ...

最新文章

  1. [android]am自动化测试框架(原创)
  2. 全国计算机二级计基础题第十五套,2014计算机二级VF试题及答案解析(第十五套)...
  3. RMAN-06214问题处理
  4. python数据分析方法五种_加速Python数据分析的10个简单技巧(上)
  5. 最简方式 表格编辑 基于 el-table
  6. 最优化课堂笔记06-无约束多维非线性规划方法(续)
  7. Centos7.3 格式化和挂载数据盘
  8. CodeForces - 1610B Kalindrome Array
  9. SQL中JOIN操作后接ON和WHERE关键字的区别
  10. 扇贝有道180914每日一句
  11. 数学建模与数学实验3.4习题1
  12. 图像处理笔记——边缘检测算子
  13. 《当代教育心理学》(第2版)学习笔记
  14. python excel条件格式_Python操作Excel学习笔记(28):条件格式
  15. 内容创业洗稿,知识付费拆书
  16. 华为服务器故障灯不开机_华为手机开不了机指示灯亮,怎么办
  17. android检测cup温度工具,android – 如何获得CPU温度?
  18. 前端开发——Vue 监听组件生命周期
  19. php 验证手机号邮箱,PHP正则验证真实姓名、手机号码、邮箱
  20. 聊聊办公室装修适合哪些风格以及装修技巧

热门文章

  1. 【记录】IOS手机如何配置whistle代理进行抓包?(苹果系列)(安卓应该也是类似处理)
  2. 高等数学——旋转体的体积
  3. htt的缺点有哪些?这里列举的几点,欢迎留言
  4. 女生无法拒绝的表白拼图
  5. vue移动端深坑之微信浏览器相关优化方案
  6. webp动图转gif
  7. How to recover from #39;programmers burnout(转)
  8. 清除浮动的几种方式,以及各自的优缺点
  9. 高知的程序员必须甩脱穷人思维
  10. C语言第十九讲——函数(2)