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

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.mzph.cn/news/86305.shtml

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

相关文章

Northstar 量化平台

基于 B/S 架构、可替代付费商业软件的一站式量化交易平台。具备历史回放、策略研发、模拟交易、实盘交易等功能。兼顾全自动与半自动的使用场景。 已对接国内期货股票、外盘美股港股。 面向程序员的量化交易软件&#xff0c;用于期货、股票、外汇、炒币等多种交易场景&#xff…

【MySQL集群二】使用MyCat和ProxySql代理MySQL集群

中间件代理MySQL MyCat安装MyCat介绍&#xff1a;步骤1&#xff1a;安装Java环境步骤2&#xff1a;下载并解压Mycat步骤3&#xff1a;配置Mycat步骤4&#xff1a;启动Mycat ProxySql安装ProxySql介绍&#xff1a;步骤1&#xff1a;更新系统步骤2&#xff1a;安装ProxySQL步骤3&…

微信小程序快速入门01(含案例)

文章目录 前言一、组件1.常用视图容器类组件viewscroll-viewswiper、swiper-item 2.text、rich-text3.其他常用组件buttonimagenavigator 二、小程序API三、数据绑定1.定义页面数据2.绑定数据 四、事件绑定1.什么是事件2.小程序中常用的事件3.事件对象 的属性列表target和curre…

详解Renko图表如何表现价格变动

相信大多数投资者与FPmarkets澳福一样&#xff0c;都已发现Renko图表与日本烛台图一样&#xff0c;具有上升和下降的特性。增长期间的典型砖块颜色为绿色或白色&#xff0c;而衰退期前的Renko则呈现红色或黑色。 今天&#xff0c;FPmarkets澳福将与各位投资者共同探讨Renko图表…

第一个 Go 程序“hello,world“ 与 main 函数

第一个 Go 程序"hello&#xff0c;world" 与 main 函数 文章目录 第一个 Go 程序"hello&#xff0c;world" 与 main 函数一.创建“hello&#xff0c;world”示例程序二. “hello&#xff0c;world” 程序结构拆解三、main 函数四、Go 语言中程序是怎么编译…

PowerDesigner 连接 MYSQL

我使用的是powerDesigner16的版本&#xff0c;使用前先保证安装了 mysql odbc 驱动包 选择&#xff1a;文件 -> 反向工程 -> database… 一大波图片正在来袭。。。 点击确认 至此连接成功

【JavaScript保姆级教程】Javascript常量

文章目录 前言一、常量1.1 常量是什么1.2 常量的作用 二、示例代码2.1 示例1&#xff1a;声明一个常量2.2 示例2&#xff1a;常量的命名规则2.3 示例3&#xff1a;常量与变量的区别 总结 前言 欢迎来到【JavaScript保姆级教程】&#xff01;在本篇教程中&#xff0c;我们将讨论…

【激光雷达码盘偏摆角的真假点映射关系】

激光雷达码盘偏摆角的真假点映射关系 一、概要二、完架构流程三、技术细节四、完整代码 一、概要 本代码主要计算激光雷达码盘偏摆角&#xff08;也可以理解为雷达的零位角&#xff09;导致的实际slam建图距离的偏差&#xff0c;只取了第一个象限作为分析目标。最终得出的结论是…

浅谈Deep Learning 与 Machine Learning 与Artificial Intelligence

文章目录 三者的联系与区别 三者的联系与区别 “Deep Learning is a kind of Machine Learning, and Machine Learning is a kind of Artificial Intelligence.” 人工智能&#xff08;AI&#xff09;&#xff0c;机器学习&#xff08;Machine Learning&#xff0c;简称ML&am…

41. Linux系统配置FTP服务器并在QT中使用QFtp实现文件上传

1. 说明 这篇博客主要记录一些在Linux系统中搭建FTP服务器时踩过的一些坑,以及在使用QFtp上传文件时需要注意的问题。 2. FTP环境搭建 在linux系统中,需要安装vsftpd,可以在终端中输入下面的命令进行安装: sudo apt-get install vsftpd使用上述命令安装后,系统中会有一…

价值1000的情感爆文写作prompt,助你写出10万+阅读微信爆文

原文&#xff1a;价值1000的情感爆文写作prompt&#xff0c;助你写出10万阅读微信爆文 - 知乎 是否经常看到一些自媒体晒出这样的图片&#xff1f; 或者是这样的10w的阅读文章 那么这是真实能赚钱的吗&#xff1f;还是自媒体夸大其说&#xff0c;吸引流量。 我们先简单了解什…

【C++】bitset位图的简单模拟实现及常见面试题

文章目录 前言一、 bitset模拟实现二、 常见面试题1.给你一百亿个整数&#xff0c;找到只出现一次的数字2. 给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 前言 快速查找某个数据是否在一个集合中排序 去重…

有名管道及其应用

创建FIFO文件 1.通过命令&#xff1a; mkfifo 文件名 2.通过函数: mkfifo #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 参数&#xff1a; -pathname&#xff1a;管道名称的路径 -mode&#xff1a;文件的权限&a…

程序员的快乐如此简单

最近在GitHub上发起了一个关于Beego框架的小插件的开源仓库&#xff0c;这一举动虽然看似微小&#xff0c;但其中的快乐和意义却是无法用言语表达的。 Beego是一个开源的Go语言Web框架&#xff0c;它采用了MVC架构模式&#xff0c;并集成了很多常用的功能和中间件。小插件是指…

AIGC绘本——海马搬家来喽

随着ChatGPT的快速发展&#xff0c;人工智能领域也发生了翻天覆地的变化。今天&#xff0c;我们迎合科技潮流&#xff0c;利用AIGC的强大能力&#xff0c;可以创作很多精彩的作品&#xff0c;比如这样一本名为《海马搬家》的绘本&#xff08;注&#xff1a;此绘本根据同名儿童故…

线性绘制在NSDT 3D场布中的应用

什么是线性摆放&#xff1f; 线性摆放是指将一系列对象按照直线或者曲线进行排列&#xff0c;形成一条线或者弧线状的布局方式。在3D场布中&#xff0c;线性摆放可以应用于多个领域和场景&#xff0c;如展览设计、景观规划、商业空间布置等。 线性绘制在3D场布中的应用 展览设…

什么是CORS(跨源资源共享)?如何解决前端中的CORS问题?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CORS&#xff08;跨源资源共享&#xff09;⭐ 解决前端中的CORS问题的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为…

HCQ1-1300-D故障笔记

常用查错网址&#xff1a; SMC_ERROR (ENUM) 删除 Web

9.19号作业

2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…

AJAX的奇妙之旅(1)基础知识

一、简介 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种使用现有标准的新方法。它是一种用于创建快速动态网页的技术。AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页内容。AJAX 不需要任何浏览器插件&a…