RUST与Python对比分析

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 不仅仅是一种编程语言,更是一种涉及应用程序、性能和速度的思维方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/143832.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP Query报表的简单使用

Query报表一般是顾问做的简单输出报表&#xff0c;适用于一些单表显示&#xff0c;或者简单的多表连接 相关的事务代码 SQ01 SQ02 SQ03 1.首先去SQ03建立你自己的用户组并分配 2.SQ02去建立你自己的信息集 这里可以用改描述 这里点击生成并保存 然后去点击用户组分配&#x…

【动态内存管理】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 为什么要有动态内存分配 2. malloc和free 2.1 malloc 2.2 free 3. calloc和realloc 3.1 calloc 3.2 realloc 4.常见的动态内存的错误 4.1对NULL指针的解引用操作…

EasyHttp 更新功能 form类型post + 限制次数

场景 easyHttp gitte 很高兴帮到您 点一个star 支持一下作者吧 之前的easyHttp只支持json类型post请求&#xff0c;而且有些接口有限制次数的&#xff0c;在循环调用过程中&#xff0c;容易出现突破限制的情况&#xff0c;现在我们引入了限制次数&#xff0c;例如一分钟6次&…

JavaScript库:jQuery,简化编程

jQuery介绍 官方网站: https://jquery.com jQuery 是一个 JavaScript 库 。极大地简化了 JavaScript 编程&#xff0c;例如 JS 原生代码几十行 实现的功 能&#xff0c; jQuery 可能一两行就可以实现&#xff0c;因此得到前端程序猿广泛应用。&#xff08;现在处在比较边…

thinkPHP controller_suffix 使用方法

在‘config/route.php’配置’controller_suffix’ > true 后&#xff0c; 在controller里面所有的类都要添加Controller为后缀的名字。 在网页使用的时候不用输入Controller的后缀 访问方法,他默认自己带上controller后缀 这样做其实就为了规范controller类

我以前真的不知道独立站还有这么多优点!怪不得他们挤破头也要做!!!

文章目录 1.前言 2.了解独立站 3.独立站的优势有哪些 4.独立站的劣势有哪些 5.新手做独立站需要准备的材料和成本 6.总结 1. 前 言 随着线上购物的日益激烈&#xff0c;独立站成了许多卖家的首选&#xff0c;眼下独立站已经成为出海卖家的标配。 你是不是真的了解“独…

istio学习笔记-安装

Istioldie 1.18 / 安装指南 基于Kubernetes的Istio的微服务架构需要安装以下组件&#xff1a; Istio控制平面组件&#xff1a;包括Istio-Pilot、Istio-Policy、Istio-Telemetry等。这些组件负责微服务的管理和配置&#xff0c;如流量管理、策略执行、遥测数据收集等。数据平面…

图论16-拓扑排序

文章目录 1 拓扑排序2 拓扑排序的普通实现2.1 算法实现 - 度数为0入队列2.2 拓扑排序中的环检测 3 深度优先遍历的后续遍历3.1 使用环检测类先判断是否有环3.2 调用无向图的深度优先后续遍历方法&#xff0c;进行DFS 1 拓扑排序 对一个有向无环图G进行拓扑排序&#xff0c;是将…

重生奇迹mu超级恶魔怎么合成

重生奇迹mu强化恶魔去哪弄 重生奇迹mu强化恶魔不可以合成&#xff0c;在游戏里打怪掉。强化恶魔和强化天使也可以额外给勇士们增加伤害和增强伤害吸收。 开启主线任务的剑士、魔法师、弓箭手回归大礼包&#xff0c;迅速主线任务后打更高级的装备&#xff0c;实力突出的也可以…

Django 的国际化与本地化详解

概要 随着全球化的发展&#xff0c;为 Web 应用提供多语言支持变得日益重要。Django 作为一个功能强大的 Web 框架&#xff0c;提供了一套完整的国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;工具&#xff0c;使得开发多语言应用变得简单。本文将详…

【科研新手指南3】chatgpt辅助论文优化表达

chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上&#xff1a;逻辑/连贯性细节上一些具体的修改例子 一些建议&#xff0c;包括具体的提问范例1. 明确你的需求2. 提供上下文信息3. 明确问题类型4. 测试不同建议5. 请求详细解释综合提问范例&#xff1a; 常规技巧…

MVME5100 MOTOROLA 使用GX Works3集成工程软件进行配置

MVME5100 MOTOROLA 使用GX Works3集成工程软件进行配置 例如&#xff0c;在楼宇自动化中&#xff0c;冗余控制器可用于集中控制系统&#xff0c;以管理HVAC、照明、应急响应、电梯系统和其他电气组件。在石油和天然气领域&#xff0c;冗余控制器可以管理起重机设备的制动系统、…

我被这奇葩的答辩评价给惊呆了

最近组里有个小伙伴晋升&#xff0c;我司职级跟腾讯的不一样&#xff0c;可以理解为大概是要晋升高工&#xff08;T9&#xff09;吧。 据我了解&#xff0c;我司的晋升答辩还不成熟&#xff0c;没有统一规范和套路&#xff0c;那我就以腾讯的经验来辅导我的小伙伴吧。我想&…

乳品生产企业如何使用乳品加工ERP?乳品加工ERP软件有什么品牌

不同种类的乳制品有不同的制造工艺和仓储环境&#xff0c;并且在品质检验流程、在库时间、成本费用等方面也有很多不同之处。随着经济的发展&#xff0c;消费群体对乳品的安全和质量问题更加重视&#xff0c;而企业外部环境的变化&#xff0c;也导致乳品生产企业面临较大的经营…

java 实现 CAN口通讯

1、引入第三方库 链接&#xff1a;https://pan.baidu.com/s/1JC-Bi_Qgts5a-tGo28JcTQ?pwd6533 提取码&#xff1a;6533 将第三方库 放在libs包里&#xff0c;并在pom文件中增加依赖 <dependency><groupId>libsocket-can-java</groupId><artifactId>…

postgresql数据库优化

目录 概要 优化方法 硬件知识 CPU及服务器体系结构 内存 硬盘 文件系统及I/O调优 文件系统的崩溃恢复 Ext2文件系统 Ext3文件系统 Ext4文件系统 XFS文件系统 Barriers I/O I/O调优的方法 SSD的Trim优化 数据库性能视图 Linux监控工具 数据库内存优化 大页内存配置 vacuum…

Win10系统把D盘空间分给C盘的方法

在Win10系统中&#xff0c;用户发现C盘的空间太少了&#xff0c;导致电脑运作出现了卡顿的问题&#xff0c;所以想把D盘的空间分给C盘&#xff0c;但不清楚具体的操作步骤。接下来小编给大家介绍两种简单的操作方法&#xff0c;帮助大家轻松将Win10系统D盘的空间分给C盘&#x…

小红书自动引流软件的运行分享,以及涉及到技术与核心代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着互联网的发展&#xff0c;引流成为许多企业和个人获取潜在客户的重要手段。然而&#xff0c;手动引流不仅效率低下&#xff0c;而且效果难以保证。为了解决这一问题…

共享模型之不可变

文章目录 1. 问题提出2. 不可变对象的设计3. 设计模式—享元模式4. 享元模式案例—自定义连接池5. final原理 1. 问题提出 我们知道&#xff0c;在并发环境中&#xff0c;引起并发问题的根源是共享变量的存在&#xff0c;而之所以共享变量之所以不安全&#xff0c;是因为多线程…

跨境电商邮件营销的策略?外贸营销怎么做?

跨境电商邮件营销怎么做&#xff1f;跨境电商电子邮件营销工具&#xff1f; 随着全球电子商务的快速发展&#xff0c;跨境电商已经成为越来越多企业的选择。在跨境电商领域&#xff0c;邮件营销是一种非常重要的营销手段。蜂邮将探讨跨境电商邮件营销的策略&#xff0c;帮助企…