Mojo:新型AI语言中的7个令人惊叹的Python升级,用简单的英语解释人工智能

news2024/9/28 11:23:42

Mojo:新型AI语言中的7个令人惊叹的Python升级 编程之美 用简单的英语解释人工智能 编程之美

alt

由Coding Beauty设计的图像,使用Mojo标志和Python标志。 它比C更快,与Python一样简单,但速度提高了35000倍。

进入Mojo:一种专为AI开发人员制作的全新编程语言,由Modular公司创建,该公司由Swift的原始创作者Chris Lattner创立。

这个半著名的35000倍增长来自Mojo与其他语言之间的基准比较,使用特定AWS实例上的Mandelbrot算法。图片来源:Modular网站。 它是Python的超集,结合了Python的易用性、简单性和多功能性以及C的出色性能。

如果你对人工智能充满热情,已经掌握了Python,那么Mojo绝对值得一试。让我们一起深入探讨这种令人兴奋的语言的7个强大功能。

Mojo的特点 几天前,Mojo正式发布;现在你可以下载官方的SDK来尝试它。

尽管是在它被宣布后不久,我就注册了Mojo的访问权限,几天后我获得了访问权限。

alt

Mojo游乐场的截图来源:Coding Beauty

我探索了他们提供的所有酷炫新功能,甚至有机会运行一些代码,看看这种语言是如何工作的。以下是我发现的7个有趣的Python升级:

  1. 用于有类型变量和常量的let和var

Mojo引入了新的let和var语句,允许我们创建变量。

如果需要的话,我们可以为变量指定类型,比如Int或String,就像在TypeScript中一样。var允许变量更改;let不允许。

所以它不像JavaScript的let和var - var没有提升,let是常量。

def your_function(a, b):
    let c = a
    #取消注释以查看错误:
    # c = b  #错误:c是不可变的
    if c != b:
        let d = b
        print(d)

your_function(2, 3)
  1. 用于更快的抽象的structs

我们在C++、Go等语言中都有这些。

Structs是Mojo的一项功能,类似于Python类,但不同之处在于Mojo类是静态的:你不能在运行时添加更多方法。这是一种权衡,因为它不够灵活,但更快。

struct MyPair:
    var first: Int
    var second: Int
    #我们在这里使用'fn'而不是'def' - 我们马上会解释

    fn __init__(inout self, first: Int, second: Int):
        self.first = first
        self.second = second

    fn __lt__(self, rhs: MyPair) -> Bool:
        return self.first < rhs.first or
              (self.first == rhs.first and
               self.second < rhs.second)

这里有一种struct比class更严格的方式:所有字段必须明确定义。

alt

Mojo来源:Coding Beauty。

  1. 强类型检查

这些structs不仅给了我们灵活性,还让我们像TypeScript编译器一样在Mojo中在编译时检查变量类型。

def pairTest() -> Bool:
    let p = MyPair(1, 2)
    #取消注释以查看错误:
    # return p < 4 #会导致编译时错误
    return True

数字4是一个Int,p是一个MyPair;Mojo根本不允许这种比较。

  1. 方法重载 C++、Java、Swift等语言都有这个功能。

函数重载是指有多个具有相同名称但接受不同数据类型参数的函数。

看看这个:

struct Complex:
    var re: F32
    var im: F32

fn __init__(inout self, x: F32):
        """从实数创建复数。"""
        self.re = x
        self.im = 0.0
    fn __init__(inout self, r: F32, i: F32):
        """从实部和虚部创建复数。"""
        self.re = r
        self.im = i

像JavaScript和Python这样的无类型语言根本无法实现函数重载,这是显而易见的原因。

尽管在模块/文件函数和类方法上允许重载,但不仅仅基于返回类型,还需要函数参数具有类型。如果不这样做,重载将无法工作;

唯一会发生的事情是最近定义的函数将覆盖以前定义的具有相同名称的所有函数。

  1. 与Python模块的轻松集成

具有无缝Python支持是Mojo的最大卖点。

在Mojo中使用Python模块非常简单。作为超集,你只需调用Python.import_module()方法,并指定模块名称。

在这里,我导入了numpy,这是世界上最流行的Python库之一。

from PythonInterface import Python

#把这个想象成Python中的`import numpy as np`
let np = Python.import_module("numpy")

#现在就像在Python中使用numpy一样
array = np.array([1, 2, 3])
print(array)

你可以对任何Python模块做同样的操作;唯一的限制是你必须导入整个模块才能访问个别成员。

所有的Python模块

在Mojo中运行速度提高了35000倍。

  1. fn — 一种定义函数的新方式 fn基本上是有更严格规则的def。

def是灵活的、可变的、友好的Python;fn是常量、稳定的、丰富的Python。它就像JavaScript的严格模式,但只适用于def。

struct MyPair:
    fn __init__(inout self, first: Int, second: Int):
        self.first = first
        self.second = second

fn的规则:

不可变的参数:参数默认是不可变的 - 包括self - 所以你不能错误地改变它们。

必须指定参数的类型。

必须在fn中声明局部变量后才能使用它们(当然要使用let和var)。

明确的异常声明:如果fn引发异常,你必须明确指示 - 就像我们在Java中使用throws关键字一样。

  1. 可变和不可变函数参数

传值与传引用。

你可能在C++等语言中遇到过这个概念。

Python的def函数使用传引用,就像JavaScript一样;你可以在def内部改变作为参数传递的对象。

但是Mojo的def使用传值,所以你在def内部得到的是传递对象的副本。因此,你可以随意改变那个副本;这些改变不会影响主要对象。

传引用提高了内存效率,因为我们不必为函数制作对象的副本。

但是新的fn函数呢?像Python的def一样,默认情况下它使用传引用,但关键的区别是这些引用是不可变的。因此,我们可以在函数中读取原始对象,但不能改变它。

在Mojo中引入了一个新的、多余的关键字borrowed。

因为borrowed的作用是使Mojo fn函数中的参数不可变 - 默认情况下它们是不可变的。当处理占用大量内存的对象,或者不允许制作传递对象副本时,这是非常有价值的。

例如:

fn use_something_big(borrowed a: SomethingBig, b: SomethingBig):
    """'a'和'b'都是不可变的,因为'db'是默认的。"""
    a.print_id()  // 10
    b.print_id()  // 20

let a = SomethingBig(10)
let b = SomethingBig(20)
use_something_big(a, b)

在fn函数中,我们只需传递一个不可变的引用,而不是制作巨大的SomethingBig对象的副本。

可变参数 如果我们需要可变的参数,我们将使用新的inout关键字:

struct Car:
    var id_number: Int
    var color: String
    
    fn __init__(inout self, id: Int):
        self.id_number = id
        self.color = 'none'

    #像上面所述,self是通过引用传递以进行突变的。
    fn set_color(inout self, color: String):
        self.color = color

    #像Python中的def一样,默认情况下,参数如self被传递为borrowed。
    fn print_id(self):  #与fn print_id(borrowed self):相同
        print('Id: {0}, color: {1}')
        
car = Car(11)
car.set_color('red')  #没有错误

在fn函数中,self是不可变的,所以我们在set_color中需要inout来修改set_color中的color字段。

关键点

Mojo:是一种新的AI编程语言,具有C的速度和Python的简单性。 let和var声明:Mojo引入了let和var语句,用于创建可选类型的变量。var变量是可变的,let变量是不可变的。

Structs:Mojo具有静态structs,类似于Python类,但由于它们是不可变的,所以更快。

强类型检查:Mojo支持编译时类型检查,类似于TypeScript。

方法重载:Mojo允许函数重载,即具有相同名称但可以接受不同数据类型的函数。 Python模块集成:Mojo提供无缝支持Python,运行Python模块的速度显著提高。

fn函数定义:Mojo中的fn关键字是Python中def的严格版本,要求不可变的参数和明确的异常声明。

可变和不可变参数:Mojo引入了可变(inout)和不可变(borrowed)函数参数。

最后的想法 当我们见证Mojo的揭幕时,让人感到好奇的是,这种新的面向AI的语言可能如何彻底改变编程领域。

弥合了Python提供的易用性与C的性能差距,并引入了强大的功能,如强类型检查,这可能标志着AI开发的新时代。让我们怀着好奇心和渴望,充分利用Mojo的全部潜力。

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冒泡排序与选择排序(最low的两兄弟)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 在我们的生活中&#xff0c;无处不在用到排序&#xff0c;比如说成绩的排名&#xff0c;淘宝&#xff0c;京东等等商品在各个方面的排序&#xff0c;这样看来一个好的算 法很重要&#xff0c;接下来我们要先…

深度学习自学笔记四:浅层神经网络(一)

一、神经网络概述 神经网络是一种模仿人脑神经系统结构和功能的计算模型。它由大量相互连接的人工神经元组成&#xff0c;并通过这些神经元之间的信息传递来进行计算和学习。 神经网络的基本组成单元是神经元&#xff0c;也称为节点或单元。每个神经元接收来自其他神经元的输…

第一百五十二回 自定义组件综合实例:游戏摇杆三

文章目录 内容回顾优化性能示例代码我们在上一章回中介绍了 如何实现游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在前面章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的整个过程…

取消github向邮箱推送邮件及修改密码

取消或者说禁止github向邮箱推送邮件&#xff0c;因为量太大了&#xff0c;没多久就上万封邮件&#xff0c;于是取消订阅或者推送。 1、登录github 2、点击右上角头像&#xff0c;然后点击Settings 3、点击Notifications&#xff08;通知&#xff09; 4、取消各种推送&#x…

SpringBoot开发实战(微课视频版)

ISBN: 978-7-302-52819-7 编著&#xff1a;吴胜 页数&#xff1a;311页 阅读时间&#xff1a;2023-06-24 推荐指数&#xff1a;★★★★☆ 本文介绍SpringBoot 2.0.5 、JDK 1.8&#xff0c;虽然现在已经不维护了&#xff0c;但是大体的流程还是对口的&#xff0c; 而且书里面讲…

新手学习:ArcGIS对shp文件裁剪

新手学习&#xff1a;ArcGIS对SHP文件裁剪 新手学习 记录每个步骤&#xff0c;因为有很多控件可能刚开始还不熟悉&#xff0c;根本不知道在哪里&#xff0c;所以写的比较详细。 1.添加要裁剪的shp文件 2.查看shp文件的地理坐标系 双击shp文件&#xff0c;就可以查看shp文件的…

LeetCode【174. 地下城游戏】

一片丹心图报国&#xff0c;两行清泪为忠家。——于谦 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康…

【Linux】系统编程基于环形队列生产者消费者模型(C++)

目录 【1】引入POSIX信号量 【1.1】初始化信号量 【1.2】销毁信号量 【1.3】等待信号量 【1.4】发布信号量 【2】基于环形队列的生产消费模型 【2.1】生产消费模型打印数字模型 【2.2】生产消费模型计算公式模型 【2.3】生产消费模型计算公式加保存任务模型 【1】引入…

###Data Structure###考研重点

顺序表 顺序表 &#xff08;此代码i是序号而非角标&#xff09; 结构体&#xff1a; 插入&#xff1a;从最后一个元素逐个往后移一位 删除&#xff1a;从删除位置的下一个把每个提前一位 顺序&#xff08;循环&#xff09;队列 结构体 判断队满 &#xff08;总结&#xff…

Dependency ‘org.redisson:redisson:‘ not found解决方法 三种刷新Maven项目的方法

报错情况 在pom中导入redisson包 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId> </dependency> 爆红&#xff0c;还显示Dependency org.redisson:redisson: not found。 由于报错已经解决&#xff0c;…

postgresql-触发器

postgresql-触发器 触发器概述创建触发器管理触发器删除触发器事件触发器创建事件触发器修改触发器删除事件触发器 触发器概述 PostgreSQL 触发器&#xff08;trigger&#xff09;是一种特殊的函数&#xff0c;当某个数据变更事件&#xff08;INSERT、UPDATE、 DELETE 或者 TR…

6 年大厂程序员跟你聊聊,算法其实没那么难,要怎么准备比较好

说起算法&#xff0c;许多程序员都会一顿哀嚎&#xff0c;为啥面试要靠算法这个东西。不过这个不是咱们讨论的重点。&#xff08;我们无法改变这种现状&#xff0c;那就改变自己&#xff09; 今天&#xff0c;我们一起来聊一下&#xff0c;程序员面试的时候该如何准备算法。 …

数字图像基础,数字图像处理中的基础内容(数字图像处理概念 P2)

文章目录 人类视觉系统构造数字图像生成采样和量化像素之间的基本关系 人类视觉系统构造 锥状体&#xff1a;明亮的视野杆状体&#xff1a;微光或暗视野图像成像原理&#xff1a;类似照相机亮度适应现象&#xff1a;人的视觉不能同时在一个范围内工作同时对比现象&#xff1a;…

怒刷LeetCode的第14天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;栈 方法三&#xff1a;双指针 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;二分查找 方法二&#xff1a;线性扫描 方法三&#xff1a;递归 第三题 题目来源 …

【WSL】仅适用于装C盘情况-用WSL在win10安装LInux

研究了一点点伪分布式的内容。决定搞一个Linux系统玩一下 参考来自微软官方安装步骤&#xff1a; 旧版 WSL 的手动安装步骤 https://learn.microsoft.com/zh-cn/windows/wsl/install-manual WSL全称为&#xff0c;Windows Subsystem for Linux 法一&#xff1a;应用商店装 查…

你写过的最蠢的代码是?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

RestTemplate:简化HTTP请求的强大工具

文章目录 什么是RestTemplateRestTemplate的作用代码示例 RestTemplate与HttpClient 什么是RestTemplate RestTemplate是一个在Java应用程序中发送RESTful HTTP请求的强大工具。本文将介绍RestTemplate的定义、作用以及与HttpClient的对比&#xff0c;以帮助读者更好地理解和使…

资料分析笔记

统计术语 现期&#xff1a;现在的时间 基期&#xff1a;之前的时间 现期量 基期量 增长量&#xff08;有正负&#xff09; 增长率 【增幅、增速、r】&#xff08;有正负&#xff09; 同比&#xff1a;例&#xff1a;2014年5月 和 2013年5月 环比&#xff1a;例&#xff1a;20…

Vue通过配置代理解决跨域问题

VueCli2.0版本 1.找到config文件目录下的dev.env.js以及prod.env.js文件 dev.env.js是配置本地环境的 prod.env.js是配置正式环境的 分别在这两个文件下的API_URL中写下对应的正式服测试服域名 下面的是正式服的域名 2.配置跨域 //vue2.0 //config -> index.js proxyt…

[C++ 网络协议] 多线程服务器端

具有代表性的并发服务器端实现模型和方法&#xff1a; 多进程服务器&#xff1a;通过创建多个进程提供服务。 多路复用服务器&#xff1a;通过捆绑并统一管理I/O对象提供服务。 多线程服务器&#xff1a;通过生成与客户端等量的线程提供服务。✔ 目录 1. 线程的概念 1.1 为什…