在本指南中,咱们将比拟 Rust 和 Python 编程语言。咱们将探讨每种状况下的实用用例,回顾应用 Rust 与 Python 的优缺点,并阐明为什么 Rust 可能会取代 Python。
我将介绍以下内容:
- 什么是 Rust?
- 什么是 Python?
- 何时应用 Rust
- 何时应用 Python
- 为什么 Rust 能够取代 Python
什么是 Rust?
Rust 是一种多范式语言,使开发人员可能构建牢靠且高效的软件。Rust 重视平安和性能,相似于 C 和 C ++,速度快,内存效率高,没有垃圾收集。它能够与其余语言集成,也能够在嵌入式零碎上运行。
Rust 领有优良的文档、敌对的编译器和有用的错误信息,以及先进的工具,包含集成的包管理器、构建工具、智能多编辑器反对、主动实现和类型查看、主动格式化等。
Rust 是由 Mozilla Research 的 Graydon Hoare 在 2010 年推出的。尽管与 Python 相比,Rust 是一门年老的语言,但它的社区却在稳步发展。事实上,在 Stack Overflow 的 “2020 开发者考察 “ 中,86% 的受访者将 Rust 评为 2020 年他们最喜爱的编程语言。
乍一看,Rust 被动态化和强类型化可能看起来很极其。正如你所看到的,从久远来看,这有助于避免意外的代码行为。
什么是 Python?
Python 是一种编程语言,旨在帮忙开发人员更高效地工作,更无效地集成系统。和 Rust 一样,Python 也是多范式的,并且被设计成可扩大的。如果速度是最重要的,你能够应用低级别的 API 调用,比方 CPython。
Python 的历史能够追溯到 1991 年 Guido van Rossum 推出的 Python,它以代码的可读性、打消分号和大括号而闻名。
除了它的可扩展性,Python 是一种解释型语言,这使得它比大多数编译型语言慢。正如你所意料的那样,Python 的成熟度很高,它有一个宏大的库的生态系统和一个宏大的业余社区。
何时应用 Rust
Rust 被利用于零碎开发、操作系统、企业零碎、微控制器利用、嵌入式零碎、文件系统、浏览器组件、虚拟现实的仿真引擎等。
当性能很重要的时候,Rust 是一种罕用的语言,因为它能很好地解决大量数据。它能够解决 CPU 密集型的操作,如执行算法,这就是为什么 Rust 比 Python 更适宜零碎开发的起因。
Rust 保障了内存的安全性,让你能够控制线程行为和线程之间的资源分配形式。这使你可能构建简单的零碎,这使 Rust 比 Python 更有劣势。
总而言之,你应在以下状况下应用 Rust:
- 你的我的项目须要高性能
- 你正在构建简单的零碎
- 你器重内存平安而不是简略性
何时应用 Python
Python 能够用于许多应用领域,从 Web 开发,到数据迷信和剖析,到 AI 和机器学习,再到软件开发。
Python 被宽泛用于机器学习,数据迷信和 AI,因为它是:
- 简略易写
- 灵便的
- 蕴含大量面向数据的软件包和库
- 由杰出的工具和库生态系统反对
在以下状况下,你应该应用 Python:
- 你须要一种灵便的语言来反对 Web 开发,数据迷信和剖析以及机器学习和 AI
- 你器重可读性和简略性
- 你须要一种对初学者敌对的语言
- 与性能相比,你更喜爱语法简略和开发速度
为什么 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 采纳了一种独特的形式来确保内存平安,其中波及所有权零碎和借用查看器 (borrow checker)。Rust 的借用查看器确保援用和指针不会超过它们所指向的数据。
谬误查看与诊断
Python 和其余语言一样,提供了谬误检查和日志机制。然而在让开发者晓得出了什么问题的时候,Rust 和 Python 之间有一些比照。
举一个 Python 变量谬误的典型例子:
apple = 15
print('The available apples are:', apple)
Python 输入
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:", apple);
}
Rust 输入
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 中的变量是不可变的。除非它具备关键字 ou’'t
,否则无奈更改。
谬误:
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 列为他们打算下一步学习的十大编程语言:
相比之下,2019 年的考察将 Rust 排在列表的底部,这表明 Rust 开发人员社区正在迅速增长。
正如这些数据所示,Rust 正在成为支流开发者社区的一部分。许多大公司都在应用 Rust,一些开发者甚至用它来构建其余编程语言应用的库。驰名的 Rust 用户包含 Mozilla、Dropbox、Atlassian、npm 和 Cloudflare 等等。
Amazon Web Service 还对 Lambda,EC2 和 S3 中的性能敏感组件采纳了 Rust。在 2019 年,AWS 发表资助 Rust 我的项目,尔后为 Rust 提供了 AWS 开发工具包。
公司正越来越多地用更高效的编程语言(如 Rust)取代速度较慢的编程语言。没有其余语言能像 Rust 一样在简略和速度之间做出均衡。
总结
Rust 曾经倒退成为一种罕用的编程语言,其采用率也因而而减少。尽管 Python 在机器学习 / 数据迷信社区中占有巩固的位置,但 Rust 很可能在将来被用作 Python 库的更无效后端。
Rust 具备取代 Python 的微小后劲。在目前的趋势下,作为利用、性能和速度方面的首选编程语言,Rust 不仅仅是一种编程语言,更是一种思维形式。