1 什么是Rust?
Rust 是一种系统编程语言,注重安全性,尤其是并发安全性,支持函数式、命令式和泛型编程范式等多范式语言。Rust 在语法上与 C++ 类似,但设计者希望在保持性能的同时提供更好的内存安全性。Rust 最初是由 Mozilla Research 的 Graydon Hoare 设计和创建的,并且随着时间的推移,在 Dave Herman、Brendan Eich 和许多其他人的贡献下不断完善。Rust 设计者根据他们为 Servo Web 浏览器开发布局引擎的经验,优化了 Rust 语言和 Rust 编译器。
Rust 拥有优秀的文档、带有有用错误消息的友好编译器以及一流的工具,包括集成的包管理器、构建工具、具有自动完成和类型检查功能的智能多编辑器、自动格式化程序等。
Rust 于 2010 年发布。尽管与 Python 相比,Rust 是一门年轻的语言,但它的社区正在稳步增长。事实上,Rust 连续五年(2016、2017、2018、2019、2020)在 Stack Overflow 开发者调查中荣获“最喜爱的编程语言”称号。
乍一看,Rust 的静态和强类型可能看起来有点极端。但从长远来看,这有助于防止意外的代码行为。
02 什么是Python?
Python 是一种编程语言,旨在帮助开发人员更高效地工作并更有效地集成系统。Python提供高效的高级数据结构和简单有效的面向对象编程。Python 语法和动态类型以及解释性语言的本质使其成为大多数平台上用于脚本编写和快速应用程序开发的编程语言。随着版本的不断更新和新语言特性的添加,逐渐用于独立大型项目的开发。如果速度至关重要,则可以使用 CPython 等较低级别的 API 调用。
Python 由 Guido van Rossum 于 1991 年推出,以其代码可读性、没有分号和大括号而闻名。
除了可扩展性之外,Python 是一种解释性语言,这使得它比大多数编译语言慢。正如您所料,Python 拥有庞大的库生态系统和庞大的专业社区。
03 何时使用 Rust
Rust 用于系统开发、操作系统、企业系统、微控制器应用程序、嵌入式系统、文件系统、浏览器组件、虚拟现实模拟引擎等。
当性能很重要时,Rust 是一种常用的语言,因为它可以很好地处理大量数据。它可以处理 CPU 密集型操作,例如执行算法,这就是 Rust 比 Python 更适合系统开发的原因。
Rust 保证内存安全,并让您控制线程的行为以及线程之间的资源分配方式。这使您能够构建复杂的系统,并且也使 Rust 比 Python 更具优势。
总之,您应该在以下情况下使用 Rust:
- 您的项目需要高性能
- 您正在构建复杂的系统
- 您重视内存安全而不是简单性
04 何时使用Python
Python 可用于许多应用领域,从 Web 开发到数据科学和分析,到人工智能和机器学习,再到软件开发。
Python 广泛应用于机器学习、数据科学和人工智能,因为它:
- 简单又容易
- 灵活的
- 包含大量面向数据的包和库
- 以优秀的工具和库生态系统为后盾
在以下情况下您应该使用 Python:
- 您需要一种灵活的语言来支持 Web 开发、数据科学和分析以及机器学习和 AI
- 您重视可读性和简单性
- 您需要一种适合初学者的语言
- 与性能相比,您更喜欢语法简单性和开发速度
05 为什么 Rust 可以取代 Python
鉴于 Rust 的快速采用、流行和广泛的用例,它在不久的将来几乎不可避免地会取代 Python,以下是一些原因。
表现
Rust 超越 Python 的主要原因之一是性能。由于 Rust 直接编译为机器代码,因此代码和计算机之间没有虚拟机或解释器。
相对于 Python 的另一个关键优势是 Rust 的线程和内存管理。虽然 Rust 不像 Python 那样具有垃圾回收功能,但 Rust 中的编译器会强制检查无效内存引用泄漏和其他危险或不规则行为。
编译语言通常比解释语言更快。但 Rust 处于不同水平的原因在于,它几乎与 C 和 C++ 一样快,而且没有额外的开销。
让我们看一个用 Python 编写的 O(log n) 程序的示例,并使用迭代方法来计算完成任务所需的时间:
import random
import datetime
def binary_searcher(search_key, arr):
low = 0
high = len(arr)-1
while low <= high:
mid = int(low + (high-low)//2)
if search_key == arr[mid]:
return True
if search_key < arr[mid]:
high = mid-1
elif search_key > arr[mid]:
low = mid+1
return False
输出:
> python -m binny.py
It took 8.6μs to search
同时,让我们看一下使用迭代方法用 Rust 编写的定时 O(log n) 程序:
>use rand::thread_rng;
use std::time::Instant;
use floating_duration::TimeFormat;
fn binary_searcher(search_key: i32, vec: &mut Vec<i32>) -> bool {
let mut low: usize = 0;
let mut high: usize = vec.len()-1;
let mut _mid: usize = 0;
while low <= high {
_mid = low + (high-low)/2;
if search_key == vec[_mid] {
return true;
}
if search_key < vec[_mid] {
high = _mid - 1;
} else if search_key > vec[_mid] {
low = _mid + 1;
}
}
return false;
}
fn main() {
let mut _rng = thread_rng();
let mut int_vec = Vec::new();
let max_num = 1000000;
for num in 1..max_num {
int_vec.push(num as i32);
}
let start = Instant::now();
let _result = binary_searcher(384723, &mut int_vec);
println!("It took: {} to search", TimeFormat(start.elapsed()));
}
输出:
> cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.04s
Running target\debug\algo_rusty.exe
It took: 4.6μs to search
在不使用任何优化技术的情况下,Rust 和 Python 在同一台机器上执行类似的操作分别需要 4.6 微秒和 8.6 微秒。这意味着 Python 花费的时间几乎是 Rust 的两倍。
内存管理
与大多数现代编程语言一样,Python 被设计为内存安全的。然而,即使没有垃圾收集。在内存安全方面,Rust 让 Python 望尘莫及。
Rust 采用一种独特的内存安全方法,涉及所有权系统和借用检查器。Rust 的借用检查器确保引用和指针永远不会比它们指向的数据寿命更长。
错误检查和诊断
Python 与其他语言一样,提供错误检查和日志记录机制。但在让开发人员知道出了什么问题方面,Rust 和 Python 之间存在一些差异。
以下是 Python 变量错误的典型示例:
apple = 15
print('The available apples are:', aple)
输出:
Traceback (most recent call last):
File "binny.py", line 2, in <module>
print('The available apples are:', aple)
NameError: name 'aple' is not defined
Rust 中的类似示例:
fn main() {
let apple = 15;
println!("The available apples are:", aple);
}
输出:
println!("The available apples are:", aple);
^^^^ help: a local variable with a similar name exists: `apple`
在这里,Rust 建议您可能想要导入的变量。Python 只是抛出错误,而不给出如何修复它们的建议。
另一个例子:
fn main() {
let grass = 13;
grass += 1;
}
此代码会引发错误,因为 Rust 中的变量默认是不可变的。除非具有关键字 mut ,否则无法更改它。
错误:
let grass = 13;
| -----
| |
| first assignment to `grass`
| help: make this binding mutable: `mut grass`
修改:
fn main() {
let mut _grass: i32 = 13;
_grass += 1;
}
如您所见,现在它不会抛出任何错误。除此之外,Rust 不允许不同的数据类型进行互操作,除非将它们转换为相同的类型。
因此,维护 Rust 代码库通常很容易。除非另有说明,Rust 不允许更改。Python 允许这种性质的改变。
与大多数编译语言相比,Rust 因其速度、有保证的内存安全、卓越的可靠性、一致性和用户友好性而受到青睐。在编程中,我们已经达到了速度开始变得毫不费力的地步。
随着技术的发展,它变得越来越快,试图在更短的时间内做更多的事情,而不需要太多的权衡。Rust 有助于在不妨碍开发人员的情况下实现这一点。当技术试图突破所能实现的界限时,它也会考虑系统的安全性和可靠性,这也是 Rust 背后的主要思想。
并行计算
除了速度之外,Python 在并行计算方面也存在局限性。
Python使用全局解释器锁(GIL),它鼓励只有一个线程并发执行,以提高单线程性能。这是一个很大的限制,因为这意味着您无法使用多个 CPU 核心进行密集计算。
社区
如前所述,Stack Overflow 的“2020 年开发者调查”中,86% 的受访者将 Rust 称为他们 2020 年最喜欢的编程语言。
同样,2020 年 HackerRank 开发者技能报告的受访者将 Rust 列为他们下一步计划学习的十大编程语言。
这些数字表明 Rust 正在成为主流开发者社区的一部分。Rust 被许多大公司使用,一些开发人员甚至使用它来构建其他编程语言使用的库。著名的 Rust 用户包括 Mozilla、Dropbox、Atlassian、npm 和 Cloudflare 等。
Amazon Web Service 还针对 Lambda、EC2 和 S3 中的性能敏感组件采用了 Rust。2019 年,AWS 宣布赞助 Rust 项目,并提供了适用于 Rust 的 AWS 开发工具包。
越来越多的公司用 Rust 等更高效的语言取代速度较慢的编程语言。没有其他语言能像 Rust 一样平衡简单性和速度。
06 总结
Rust 已经发展成为一种易于使用的编程语言,因此它的使用量也在增加。尽管 Python 在机器学习/数据科学社区中占有一席之地,但 Rust 未来可能会被用作 Python 库的更高效的后端。
Rust 具有取代 Python 的巨大潜力。当前的趋势是,Rust 不仅仅是一种编程语言,更是一种涉及应用程序、性能和速度的思维方式。