百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

十年 Python 程序员,初次尝试 Rust:“非常优秀!”

itomcoil 2025-01-24 12:16 30 浏览

摘要:Python 和 Rust,都是近几年深受开发者喜爱的编程语言,那么作为一个拥有十年 Python 编程经验的开发者来说,初次尝试 Rust 会有怎样的感受呢?

链接:https://karimjedda.com/carefully-exploring-rust/

声明:本文为 CSDN 翻译,未经允许禁止转载。


作者 | Karim Jedda
译者 | 弯月 责编 | 郑丽媛
出品 | CSDN(ID:CSDNnews)

最近,我找到了一份新工作,公司最常用的编程语言之一是 Rust。

在此之前,我使用 Python 长达十年之久,主要是做数据工程的工作。但如今,我打算尝试一下这种新的(对我来说)编程语言。我经常在不同平台上看到各类夸赞 Rust 的文章,我想看看 Rust 是否真的不负盛名。

Rust 与 Python 有很大的不同,因此我不打算在本文中详细说明 Rust 的独特之处。作为初学者,我只希望尽快上手,希望能以最短的过渡,尽快 Rust 完成工作,同时也希望评估一下我自己的学习能力。

从某种程度上来说,我更感兴趣的是 Rust 整体的使用体验,而不是具体的功能列表。


设置开发环境


设置开发环境非常简单,只需参照 Rust 网站提供的示例,在终端中运行一个命令就可以了。

当你认为一切都已安装并配置妥当,此时如果想验证 Rust 是否已正确安装,只需在空目录中创建一个空项目:

cargo new tutorialcd tutorialcargo run

接下来,在文本编辑器中打开该文件夹。如果你是新手,我推荐 VSCode,因为其中的一些扩展很有帮助,关于如何使用这些扩展的指南也很容易入手。我推荐 rust-analyzer 作为 VSCode 的唯一扩展。


输出与调试

如果想了解程序是如何运行的,首先要做的就是通过命令行来了解程序在干什么,以及完成了什么。

此外,你还可以使用常规调试器。在 M1 上,我推荐在 Visual Studio Code 中使用 LLDB,它不仅工作良好,通常还要比在输出结果中打印日志更为方便。

到这里为止,Rust 与 Python 其实都非常相似,只不过所有命令都是通过 cargo run 运行的,而不是调用特定文件,如 python3 somefile.py。

另外,你也可以先运行 cargo build,然后运行 target/debug/tutorial 中的文件,得到的结果是相同的。接下来,如果将生成的文件复制到另一个位置或另一台类似的机器上,也可以正常工作,且无需安装任何与 Rust 相关的东西。


错误处理


不得不承认,编程中总会遇到一些意外,能够以可预测的方式处理这些意外非常重要。编程中的一大挑战就是很难考虑到程序中所有可能出现的错误,因为只要写代码就可能会出错。

“每个人都知道调试比编写程序要难一倍。所以,如果你在代码编写代码时就用尽了聪明才智,又如何调试呢?”

—— Brian W. Kernighan

在 Python 中,通常我们通过 try/except 方法来抛异常,并完成错误处理。我们运行一段代码,如果出错,则通过条件来捕捉异常,如果所有条件都不匹配,则将其放入一个通用的异常中。异常有各种不同的类别,Python 允许你在包中调用不存在的函数,并在运行时产生异常,但在 Rust 中这样做甚至无法通过编译——Rust 不允许在运行时出现任何奇怪的错误,从而消除了一大类不太容易预测的错误。

下面通过一个例子来说明 Rust 的这种方法,同时我会用 Python 的术语进行解释。

在上面的代码中,我们创建了一个自定义的异常,在 do_something 函数中抛出,而 main 函数会检查该异常。上面的代码跟 try/exept 基本上一样,只不过多了一些样板代码这些样板代码是必须的,但以我现在的水平有点难以理解

你也许会说“肯定有更好的办法”,特别是如果你有很多 Python 经验的话,的确如此,我们将不得不使用包。。


使用外部包


与其他行业相比,编程的最大优势就是可以使用别人构建的东西。如果你计划在程序中进行错误处理,那么有一个很好用的包 thiserror。Rust 的包管理器是 cargo。

Rust 中的包叫做 crate。安装方法为编辑目录下的 Cargo.toml 文件。在本例中,我们在 [dependencies] 后面添加 thiserror = "1.0" 就可以了。

然后可以像下面这样重写之前的代码:

现在代码看起来很正常。与一切从头开始相比,我更喜欢这种做法。

我花了四五年时间才找到用 Python 编程的乐趣,所以我也愿意多花些时间来探索 Rust 的高级功能。Rust 有许多错误处理的方法,而我喜欢更简单的方法。

我有意略过了一些简单的概念,比如“什么是 enum?” “pub 是什么意思?” “那些#标记是什么”等,因为你只需运行一下代码就能明白它们的意思。

一切看起来都还不错。那么,测试方面又如何呢?


编写测试


测试应该从单元测试和集成测试两个级别上着手。实现方法有好几种,虽然你可以把测试代码和 Rust 代码放在同一个文件中(这也是官方指南的推荐),但我还是希望用一个单独的文件夹来组织所有测试代码,这样可以减少阅读代码时的负担,也可以减少编辑文件时占用的屏幕面积。而且说实话,在编写测试和编写代码时,我的心情是不一样的。

方法之一如下:

然后可以用 cargo test 运行测试,结果如下:

还有许多值得展开讲的地方,但为了避免过于复杂,我们点到为止,这算是“帕累托最优”(又称80/20法则)。这让我想起了 pytest,一个能即刻提高舒适度的工具。


读取文件、运行一些代码并写入另一个文件


以上,我们讨论了一些最基本的问题:输出,调试,使用外部包,以及测试。下面,我们来做一些更有效率的事情:我们可以写一个程序来处理本地文件。下面的例子将会读取 CSV 文件,计算一些数值,然后将输出结果。

为了实现该程序,我们需要在 Cargo.toml 中添加以下两行设置:

  • csv="1.1"

  • serde={version="1", features=["derive"]}

你可以猜猜 main() 函数应该怎样写。

当然,这个程序还可以实现更多功能。如果你有一个非常复杂的 CSV 文件,则可以在 Rust 中调用 pandsa(pola.rs)来处理数据。我还需要进一步研究,不过似乎这种处理方法非常强大且高效

我认为,与 Python 相比,Rust的 CSV 处理能力不相上下,除了它能自动反序列化之外。

最后,我们还可以添加一些测试,此处不再赘述。


发送 HTTP 请求


下面,我们来尝试发送基本的 HTTP 请求并处理结果。现在的绝大多数请求都需要处理 JSON。

在 Cargo.toml 中添加如下几行代码:

reqwest = { version = "0.11", features = ["json"] }tokio = { version = "1", features = ["full"]}serde_json = "1"

这样就可以了,现在可以从 API 请求数据了。结合使用上面两个方法,我们可以获取数据,用 pola.rs 进行分析,然后将结果写入 CSV 文件中,同时保证内存安全。还记得 Python 需要循环才能实现这一点吗?在这方面 Rust 做得很好。

我相信,Rust 的生态系统会越来越大,以覆盖更多的用例,以后利用已有的 crate 实现这一切会易如反掌。


使用 SQLite


虽然在这篇文章中提到 SQLite 似乎有些奇怪,但我开发过的程序经常用到 SQLite。我很喜欢 SQLite,因为它是可移植的,非常有效,而且不需要任何维护。

用 Python 操作 SQLite 的问题永远是要不要使用 ORM。请不要误会,SQLAlchemy 非常优秀,但在进行非常小的操作时,用它就像杀鸡用牛刀了。而且 SQLAlchemy 带来的复杂性使它不适合小型嵌入式设备。

反之, Rust 可以在这方面大放异彩,网上有很多如何利用Rust操作 SQLite 的例子,我认为都非常不错。

举个简单的例子,别忘了在 Cargo.toml 中添加下面这行代码:

rusqlite = { version = "0.28.0", features = ["bundled"] }

该例子来自 rusqlite crate。当然,这只是冰山一角。但组合以上几种方法,就可以实现许多很有用的功能了。


总结


综合考虑,Rust 是一个非常优秀的语言,有许多优秀的包,非常感谢发明这门语言并为之努力贡献的开发者们。虽然这篇文章只是对 Rust 做了初步的探索,但我希望抛砖引玉,让初学者产生学习 Rust 的兴趣。

初次使用某种编程语言时,重点在于弄清楚语言本身能实现哪些功能,而不是背诵一篇完整的术语表。你不需要去理解 borrowing、继承或 traits 的具体含义,而应该跟随些入门文章按部就班地做一遍。

从无到有的难度远大于从一到十。

相关推荐

Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)

在开始本文之前提醒各位朋友,Python记得安装PyQt5库文件,Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Python语言的开放...

Connect 2.0来了,还有Nuke和Maya新集成

ftrackConnect2.0现在可以下载了--重新设计的桌面应用程序,使用户能够将ftrackStudio与创意应用程序集成,发布资产等。这个新版本的发布中还有两个Nuke和Maya新集成,...

Magicgui:不会GUI编程也能轻松构建Python GUI应用

什么是MagicguiMagicgui是一个Python库,它允许开发者仅凭简单的类型注解就能快速构建图形用户界面(GUI)应用程序。这个库基于Napari项目,利用了Python的强大类型系统,使得...

Python入坑系列:桌面GUI开发之Pyside6

阅读本章之后,你可以掌握这些内容:Pyside6的SignalsandSlots、Envents的作用,如何使用?PySide6的Window、DialogsandAlerts、Widgets...

Python入坑系列-一起认识Pyside6 designer可拖拽桌面GUI

通过本文章,你可以了解一下内容:如何安装和使用Pyside6designerdesigner有哪些的特性通过designer如何转成python代码以前以为Pyside6designer需要在下载...

pyside2的基础界面(pyside2显示图片)

今天我们来学习pyside2的基础界面没有安装过pyside2的小伙伴可以看主页代码效果...

Python GUI开发:打包PySide2应用(python 打包pyc)

之前的文章我们介绍了怎么使用PySide2来开发一个简单PythonGUI应用。这次我们来将上次完成的代码打包。我们使用pyinstaller。注意,pyinstaller默认会将所有安装的pack...

使用PySide2做窗体,到底是怎么个事?看这个能不能搞懂

PySide2是Qt框架的Python绑定,允许你使用Python创建功能强大的跨平台GUI应用程序。PySide2的基本使用方法:安装PySide2pipinstallPy...

pycharm中conda解释器无法配置(pycharm安装的解释器不能用)

之前用的好好的pycharm正常配置解释器突然不能用了?可以显示有这个环境然后确认后可以conda正在配置解释器,但是进度条结束后还是不成功!!试过了pycharm重启,pycharm重装,anaco...

Conda使用指南:从基础操作到Llama-Factory大模型微调环境搭建

Conda虚拟环境在Linux下的全面使用指南:从基础操作到Llama-Factory大模型微调环境搭建在当今的AI开发与数据分析领域,conda虚拟环境已成为Linux系统下管理项目依赖的标配工具。...

Python操作系统资源管理与监控(python调用资源管理器)

在现代计算环境中,对操作系统资源的有效管理和监控是确保应用程序性能和系统稳定性的关键。Python凭借其丰富的标准库和第三方扩展,提供了强大的工具来实现这一目标。本文将探讨Python在操作系统资源管...

本地部署开源版Manus+DeepSeek创建自己的AI智能体

1、下载安装Anaconda,设置conda环境变量,并使用conda创建python3.12虚拟环境。2、从OpenManus仓库下载代码,并安装需要的依赖。3、使用Ollama加载本地DeepSe...

一文教会你,搭建AI模型训练与微调环境,包学会的!

一、硬件要求显卡配置:需要Nvidia显卡,至少配备8G显存,且专用显存与共享显存之和需大于20G。二、环境搭建步骤1.设置文件存储路径非系统盘存储:建议将非安装版的环境文件均存放在非系统盘(如E盘...

使用scikit-learn为PyTorch 模型进行超参数网格搜索

scikit-learn是Python中最好的机器学习库,而PyTorch又为我们构建模型提供了方便的操作,能否将它们的优点整合起来呢?在本文中,我们将介绍如何使用scikit-learn中的网格搜...

如何Keras自动编码器给极端罕见事件分类

全文共7940字,预计学习时长30分钟或更长本文将以一家造纸厂的生产为例,介绍如何使用自动编码器构建罕见事件分类器。现实生活中罕见事件的数据集:背景1.什么是极端罕见事件?在罕见事件问题中,数据集是...