[ 更换 ]
热门城市
北京上海广州深圳成都杭州南京武汉天津西安重庆青岛沈阳长沙大连厦门无锡福州济南宁波昆明苏州郑州长春合肥南昌哈尔滨常州烟台南宁温州石家庄太原珠海南通扬州贵阳东莞徐州大庆佛山威海洛阳淮安呼和浩特镇江潍坊桂林中山临沂咸阳包头嘉兴惠州泉州三亚赣州九江金华泰安榆林许昌新乡舟山慈溪南阳聊城海口东营淄博漳州保定沧州丹东宜兴绍兴唐山湖州揭阳江阴营口衡阳郴州鄂尔多斯泰州义乌汕头宜昌大同鞍山湘潭盐城马鞍山襄樊长治日照常熟安庆吉林乌鲁木齐兰州秦皇岛肇庆西宁介休滨州台州廊坊邢台株洲德阳绵阳双流平顶山龙岩银川芜湖晋江连云港张家港锦州岳阳长沙县济宁邯郸江门齐齐哈尔昆山柳州绍兴县运城齐河衢州太仓张家口湛江眉山常德盘锦枣庄资阳宜宾赤峰余姚清远蚌埠宁德德州宝鸡牡丹江阜阳莆田诸暨黄石吉安延安拉萨海宁通辽黄山长乐安阳增城桐乡上虞辽阳遵义韶关泸州南平滁州温岭南充景德镇抚顺乌海荆门阳江曲靖邵阳宿迁荆州焦作丹阳丽水延吉茂名梅州渭南葫芦岛娄底滕州上饶富阳内江三明淮南孝感溧阳乐山临汾攀枝花阳泉长葛汉中四平六盘水安顺新余晋城自贡三门峡本溪防城港铁岭随州广安广元天水遂宁萍乡西双版纳绥化鹤壁湘西松原阜新酒泉张家界黔西南保山昭通河池来宾玉溪梧州鹰潭钦州云浮佳木斯克拉玛依呼伦贝尔贺州通化朝阳百色毕节贵港丽江安康德宏朔州伊犁文山楚雄嘉峪关凉山雅安西藏四川广东河北山西辽宁黑龙江江苏浙江安徽福建江西山东河南湖北湖南海南贵州云南陕西甘肃青海台湾内蒙古广西宁夏香港澳门
培训资讯网 - 为兴趣爱好者提供专业的职业培训资讯知识

软件开发 | 结合使用 Python 和 Rust

开发
软件开发 | 结合使用 Python 和 Rust

Rust 和 Python 的优势互补。可以使用 Python 进行原型设计,然后将性能瓶颈转移到 Rust 上。

Python 和 Rust 是非常不同的语言,但它们实际上非常搭配。但在讨论如何将 Python 与 Rust 结合之前,我想先介绍一下 Rust 本身。你可能已经听说了这种语言,但可能还没有了解过它的细节。

什么是 Rust?

Rust 是一种低级语言,这意味着程序员所处理的东西接近于计算机的 “真实” 运行方式。

例如,整数类型由字节大小定义,与 CPU 支持的类型相对应。虽然我们很想简单地说 Rust 中的 a+b对应于一条机器指令,但实际上并不完全是这样!

Rust 编译器链非常复杂。作为第一种近似的方法,将这样的语句视为 “有点” 真实是有用的。

Rust 旨在实现零成本抽象,这意味着许多语言级别可用的抽象在运行时环境中会被编译去掉。

例如,除非明确要求,对象会在堆栈上分配。结果是,在 Rust 中创建本地对象没有运行时成本(尽管可能需要进行初始化)。

最后,Rust 是一种内存安全的语言。也有其他内存安全的语言和其他支持零成本抽象的语言。但通常这些是两类不同的语言。

内存安全并不意味着不可能在 Rust 中出现内存违规。它确实意味着只有两种方式可能导致内存违规:

  • 编译器的错误。
  • 显式声明为不安全(unsafe)的代码。

Rust 标准库代码有很多被标记为不安全的代码,虽然比许多人预期的少。这并不意味着该语句无意义。除了需要自己编写不安全代码的(罕见的)情况外,内存违规通常是由基础设施造成的。

为什么会有 Rust 出现?

为什么人们要创建 Rust?是哪些问题没有被现有编程语言解决吗?

Rust 被设计成既能高效运行,又保证内存安全。在现代的联网世界中,这是一个越来越重要的问题。

Rust 的典型应用场景是协议的低级解析。待解析的数据通常来自不受信任的来源,并且需要通过高效的方式进行解析。

如果你认为这听起来像 Web 浏览器所做的事情,那不是巧合。Rust 最初起源于 Mozilla 基金会,它是为了改进 Firefox 浏览器而设计的。

如今,需要保证安全和速度的不仅仅是浏览器。即使是常见的微服务架构也必须能够快速解析不受信任的数据,同时保证安全。

现实示例:统计字符

为了理解 “封装 Rust” 的例子,需要解决一个问题。这个问题需要满足以下要求:

  • 足够容易解决。
  • 能够写高性能循环来优化。
  • 有一定的现实意义。

这个玩具问题的例子是判断一个字符在一个字符串中是否出现超过了 X 次。这个问题不容易通过高效的正则表达式解决。即使是专门的 Numpy 代码也可能不够快,因为通常没有必要扫描整个字符串。

你可以想象一些 Python 库和技巧的组合来解决这个问题。然而,如果在低级别的语言中实现直接的算法,它会非常快,并且更易于阅读。

为了使问题稍微有趣一些,以演示 Rust 的一些有趣部分,这个问题增加了一些变化。该算法支持在换行符处重置计数(意即:字符是否在一行中出现了超过 X 次?)或在空格处重置计数(意即:字符是否在单词中出现了超过 X 次?)。

这是唯一与 “现实性” 相关的部分。过多的现实性将使这个示例在教育上不再有用。

支持枚举

Rust 支持使用枚举(enum)。你可以使用枚举做很多有趣的事情。

目前,只使用了一个简单的三选一的枚举,并没有其他的变形。这个枚举编码了哪种字符重置计数。

#[derive(Copy)]
enum Reset {
    NewlinesReset,
    SpacesReset,
    NoReset,
}

支持结构

接下来的 Rust 组件更大一些:这是一个结构(struct)。Rust 的结构与 Python 的dataclass有些相似。同样,你可以用结构做更复杂的事情。

#[pyclass]
struct Counter {
    what: char,
    min_number: u64,
    reset: Reset, 
}

实现块

你可以在 Rust 中使用一个单独的块,称为实现(impl)块,为结构添加一个方法。但具体细节超出了本文的范围。

在这个示例中,该方法调用了一个外部函数。这主要是为了分解代码。更复杂的用例将指示 Rust 编译器内联该函数,以便在不产生任何运行时成本的情况下提高可读性。

#[pymethods]
impl Counter {
    #[new]
    fn new(what: char, min_number: u64, reset: Reset) -> Self {
        Counter{what: what, min_number: min_number, reset: reset}
    }
    
    fn has_count(
        &self,
        data: &str,
    ) -> bool {
        has_count(self, data.chars)
    }
}

函数

默认情况下,Rust 变量是常量。由于当前的计数(current_count)必须更改,因此它被声明为可变变量。

fn has_count(cntr: &Counter, chars: std::str::Chars) -> bool {
    let mut current_count : u64 = 0;
    for c in chars {
        if got_count(cntr, c, &mut current_count) {
            return true;
        }
    }
    false
}

该循环遍历字符并调用 got_count函数。再次强调,这是为了将代码分解成幻灯片展示。它展示了如何向函数发送可变引用。

尽管 current_count是可变的,但发送和接收站点都显式标记该引用为可变。这可以清楚地表明哪些函数可能修改一个值。

计数

got_count函数重置计数器,将其递增,然后检查它。Rust 的冒号分隔的表达式序列评估最后一个表达式的结果,即是否达到了指定的阈值。

fn got_count(cntr: &Counter, c: char, current_count: &mut u64) -> bool {
    maybe_reset(cntr, c, current_count);
    maybe_incr(cntr, c, current_count);
    *current_count >= cntr.min_number
}

重置代码

reset的代码展示了 Rust 中另一个有用的功能:模式匹配。对 Rust 中匹配的完整描述需要一个学期级别的课程,不适合在一个无关的演讲中讲解。这个示例匹配了该元组的两个选项之一。

fn maybe_reset(cntr: &Counter, c: char, current_count: &mut u64) ->  {
    match (c, cntr.reset) {
        ("\n", Reset::NewlinesReset) | (" ", Reset::SpacesReset)=> {
            *current_count = 0;
        }
        _ => {}
    };
}

增量支持

增量将字符与所需字符进行比较,并在匹配时增加计数。

fn maybe_incr(cntr: &Counter, c: char, current_count: &mut u64) -> {
    if c == cntr.what {
        *current_count += 1;
    };
}

请注意,我在本文中优化了代码以适合幻灯片。这不一定是 Rust 代码的最佳实践示例,也不是如何设计良好的 API 的示例。

为 Python 封装 Rust 代码

为了将 Rust 代码封装到 Python 中,你可以使用 PyO3。PyO3 Rust “crate”(即库)允许内联提示将 Rust 代码包装为 Python,使得修改两者更容易。

包含 PyO3 crate 原语

首先,你必须包含 PyO3 crate 原语。

use pyo3::prelude::*;

封装枚举

枚举需要被封装。derive从句对于将枚举封装为 PyO3 是必需的,因为它们允许类被复制和克隆,使它们更容易在 Python 中使用。

#[pyclass]
#[derive(Clone)]
#[derive(Copy)]
enum Reset {
    /* ... */
}

封装结构

结构同样需要被封装。在 Rust 中,这些被称为 “宏”,它们会生成所需的接口位。

#[pyclass]
struct Counter {
    /* ... */
}

封装实现

封装实现(impl)更有趣。增加了另一个名为new的宏。此方法被标记为#[new],让 PyO3 知道如何为内置对象公开构造函数。

#[pymethods]
impl Counter {
    #[new]
    fn new(what: char, min_number: u64,
          reset: Reset) -> Self {
        Counter{what: what,
          min_number: min_number, reset: reset}
    }
    /* ... */
}

定义模块

最后,定义一个初始化模块的函数。此函数具有特定的签名,必须与模块同名,并用 #[pymodule]修饰。

#[pymodule]
fn counter(_py: Python, m: &PyModule
) -> PyResult {
    m.add_class::

?显示此函数可能失败(例如,如果类没有正确配置)。PyResult在导入时转换为 Python 异常。

Maturin 开发

为了快速检查,用 maturin develop构建并将库安装到当前虚拟环境中。这有助于快速迭代。

$ maturin develop

Maturin 构建

maturin build命令构建一个manylinux轮子,它可以上传到 PyPI。轮子是特定于 CPU 架构的。

Python 库

从 Python 中使用库是最简单的部分。没有任何东西表明这与在 Python 中编写代码有什么区别。这其中的一个有用方面是,如果你优化了已经有单元测试的 Python 中的现有库,你可以使用 Python 单元测试来测试 Rust 库。

导入

无论你是使用 maturin develop还是pip install来安装它,导入库都是使用import完成的。

import counter

构造函数

构造函数的定义正好使对象可以从 Python 构建。这并不总是如此。有时仅从更复杂的函数返回对象。

cntr = counter.Counter(
    "c",
    3,
    counter.Reset.NewlinesReset,
)

调用函数

最终的收益终于来了。检查这个字符串是否至少有三个 “c” 字符:

>>> cntr.has_count("hello-c-c-c-goodbye")
True

添加一个换行符会触发剩余操作,这里没有插入换行符的三个 “c” 字符:

>>> cntr.has_count("hello-c-c-\nc-goodbye")
False

使用 Rust 和 Python 很容易

我的目标是让你相信将 Rust 和 Python 结合起来很简单。我编写了一些“粘合剂”代码。Rust 和 Python 具有互补的优点和缺点。

Rust 非常适合高性能、安全的代码。Rust 具有陡峭的学习曲线,对于快速原型解决方案而言可能有些笨拙。

Python 很容易入手,并支持非常紧密的迭代循环。Python 确实有一个“速度上限”。超过一定程度后,从 Python 中获得更好的性能就更难了。

将它们结合起来完美无缝。在 Python 中进行原型设计,并将性能瓶颈移至 Rust 中。

使用 Maturin,你的开发和部署流程更容易进行。开发、构建并享受这一组合吧!

via: https://opensource.com/article/23/3/python-loves-rust

作者:Moshe Zadka选题:lkxed译者:ChatGPT 校对:wxy

本文由 LCTT原创编译,Linux中国荣誉推出

相关内容

【联线智慧法院】内蒙古自治区高级人民法院举办第十四期政法大数据平台与规范量刑智能辅助系统培训

为全面贯彻落实2023年全区政法工作重点任务,进一步提升全区法院应用政法大数据智能化应用平台的能力和水平,10月20日,自治区高院针对全区政法大数据平台及规范量刑智能辅助系统的使用开展全面系统的实操培训。自治区高院党组副书记、副院长王旭军,···

贵州省生态环境厅电子政务中心举办2023年全省生态环境网络安全培训班

10月12日至13日,贵州省生态环境厅电子政务中心举办了2023年全省生态环境网络安全培训班,厅直属各单位和各市(州)生态环境局信息技术负责人现场参训,各区(县)生态环境分局通过视频会议参训。本次培训班强调,贵州省生态环境厅电子政务中心作为···

提升网络建设水平 海南举办2023年电子政务网络安全专题培训

新海南客户端、南海网、南国都市报5月19日消息(记者 姚皓)5月19日,海南2023年电子政务网络安全专题培训在澄迈举行,活动旨在加快推进海南省网络安全建设,加强全省党政机关单位网络安全防护水平,为海南自贸港、数字政府建设创造安全、有序、稳···

格尔木市气象局举办2023年网络安全培训班

10月27日,格尔木市气象局举办网络安全知识培训班,进一步加强网络安全宣传教育,营造安全、健康、文明、和谐的网络环境。格尔木市气象局全体干部职工通过线上或线下方式参加了此次培训。培训围绕网络安全、数据安全等方面展开,解读了当前国内外网络安全···

2023年黑龙江省网络安全宣贯培训会在哈尔滨召开

为贯彻落实中央网信办、公安部相关工作要求,推动党委(党组)网络安全工作责任制和关键信息基础设施安全保护制度深入落实,7月18日,由省委网信办、省公安厅联合举办的2023年黑龙江省网络安全专题培训暨《关键信息基础设施安全保护要求》国家标准宣贯···

京湾区数学建模与人工智能培训在澳门举办

8月25至26日,国家人工智能推广暨京湾区数学建模与人工智能培训在澳门培正中学及康桥教育中心举行。图为部分出席者25日在澳门培正中学合影。 钟欣 摄中新网澳门8月26日电 国家人工智能推广暨京湾区数学建模与人工智能培训25日至26日在澳门培···

淘宝大学参与香港KOL培训 赋能香港青年就业创业

中新社香港3月16日电 (记者 史冰筠)香港青年电商促进会16日宣布,将同阿里巴巴旗下培训平台淘宝大学联合举办淘宝主播培训班,聘请淘宝大学专业的直播导师进行授课,希望赋能学员通过电商拓宽就业、创业渠道,带动香港电商发展。香港青年电商促进会在···

调查:近半香港企业开展新科技培训 涵盖大数据等

中新网6月25日电 据香港《文汇报》报道,香港的一项调查发现,46%受访企业于过去2年间,已开展和新科技有关的雇员培训,内容涵盖大数据、云端技术、物联网及人工智能等。香港人力资源管理学会公布香港培训调查报告。图片来源:香港《文汇报》/赵梦萦···

港媒:近半香港企业开展新科技培训 涵盖大数据等

据香港《文汇报》报道,香港的一项调查发现,46%受访企业于过去2年间,已开展和新科技有关的雇员培训,内容涵盖大数据、云端技术、物联网及人工智能等。香港人力资源管理学会公布香港培训调查报告。图片来源:香港《文汇报》/赵梦萦 摄香港人力资源管理···

自治区司法厅举办全区司法行政系统网络安全和信息化建设工作能力提升培训班

为深入学习贯彻党的二十大精神和习近平新时代中国特色社会主义思想,贯彻落实习近平总书记对网络安全和信息化工作的重要指示和全国网络安全和信息化工作会议精神,推动全区司法行政系统网络安全和信息化建设工作高质量发展,9月19日—20日自治区司法厅组···

2021年甘肃省网络安全管理员培训班在兰开班

中国甘肃网12月27日讯(本网记者 李红军 任磊)今天上午,由甘肃省委网信办主办、兰州大学国家大学科技园承办的2021年甘肃省网络安全管理员培训班在兰州开班。省委网信办副主任刘宗礼出席开班仪式并作动员讲话,兰州大学网信办主任、信息科学与工程···

数据库使用方法系列培训活动之二|台湾月旦知识库线上讲座

会议主题:西北政法大学【月旦知识库】教育训练会议时间:2022/01/18 15:30-17:30 (GMT+08:00) 中国标准时间 - 北京点击链接入会,或添加至会议列表:https://meeting.tencent.com/dm/···

2023年1 X大数据平台运维证书省级师资培训在河南开放大学举办

7月13日上午,2023年1+X“大数据平台运维证书”省级师资培训在河南开放大学(郑州信息科技职业学院)开班,此次培训由河南省教育厅主办,郑州信息科技职业学院承办。河南开放大学(郑州信息科技职业学院)副校长李小明、培训学院院长张颖、信息工程···

【国家网络安全宣传周】福安市开展网络安全培训

为进一步提升网络安全管理工作水平,增强广大干部网络安全风险防范能力,9月12日下午,福安市开展网络安全培训,福安市各乡镇(街道)、市直单位网络安全业务人员90余人参加培训。本次培训邀请了奇安信福建分区网络安全技术人员郑泽辉进行授课。现场培训···

花溪区开展教育系统网络安全培训

7月4日,由花溪区委网信办指导,区教育局主办的花溪教育系统数据安全培训在溪南高中举行,全区公民办中小学、幼儿园、中职学校相关人员300余人参训。培训邀请网络工程师对数据安全文件进行解读,并通过真实案例介绍了数据安全的问题及处置方法以及数据安···

2023年广西招商引资大数据平台(二期)专题培训会在邕召开

8月24日,2023年广西招商引资大数据平台(二期)专题培训会在南宁召开。培训会邀请大数据招商专家对平台新增功能及使用操作进行讲解,并介绍近年招商工作趋势和产业发展特点,分享大数据招商工作经验和典型案例。全区各市、县区、园区招商业务骨干和自···

云南粉笔:依托大数据智能分析打造公考培训新标准

2023年9月2日,云南粉笔在昆明举行了盛大的省考产品发布会,吸引了来自全国各地的教育专家、媒体代表以及公考学子齐聚一堂。本次发布会上,粉笔推出最新研发的省考培训产品,将线上与线下课堂相结合,依托大数据智能分析,打造公考培训新标准。 云南粉···

2023年度室内设计1 X证书师资及考评员培训(黑龙江站)成功举办

2023年8月21日-25日,为提升试点院校“室内设计职业技能等级证书”教育培训质量,积极推动2023年度证书试点工作顺利开展,由中国室内装饰协会主办、哈尔滨职业技术学院承办、黑龙江省室内装饰协会协办的“2023年度全国室内设计职业技能等级···

昆明经开区开展2023年春漫社区老年人智能手机使用暨网络安全培训活动

来源:【昆明日报-掌上春城】掌上春城讯 “五社联动送服务,点亮民生微幸福”。8月17日,昆明经济技术开发区青年志愿者协会党支部在春漫社区组织开展“融入智能e时代 健康银龄新生活”老年人智能手机使用暨网络安全培训活动。本次培训活动围绕老年人日···

2023年全省“十四五”全民健康信息化与网络安全培训班举办

5月11日—12日,2023年全省“十四五”全民健康信息化与网络安全培训班在张家口市举办。省卫生健康委二级巡视员范素文出席会议并讲话。培训班总结了2022年网络安全和信息化工作,安排了2023年重点工作。培训班邀请国家和省内有关专家对卫生健···