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

由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的访问权限,几天后我获得了访问权限。

Mojo游乐场的截图来源:Coding Beauty
我探索了他们提供的所有酷炫新功能,甚至有机会运行一些代码,看看这种语言是如何工作的。以下是我发现的7个有趣的Python升级:
-
用于有类型变量和常量的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)
-
用于更快的抽象的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更严格的方式:所有字段必须明确定义。

Mojo来源:Coding Beauty。
-
强类型检查
这些structs不仅给了我们灵活性,还让我们像TypeScript编译器一样在Mojo中在编译时检查变量类型。
def pairTest() -> Bool:
let p = MyPair(1, 2)
#取消注释以查看错误:
# return p < 4 #会导致编译时错误
return True
数字4是一个Int,p是一个MyPair;Mojo根本不允许这种比较。
-
方法重载 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这样的无类型语言根本无法实现函数重载,这是显而易见的原因。
尽管在模块/文件函数和类方法上允许重载,但不仅仅基于返回类型,还需要函数参数具有类型。如果不这样做,重载将无法工作;
唯一会发生的事情是最近定义的函数将覆盖以前定义的具有相同名称的所有函数。
-
与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倍。
-
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关键字一样。
-
可变和不可变函数参数
传值与传引用。
你可能在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 多平台发布
相关文章:

Mojo:新型AI语言中的7个令人惊叹的Python升级,用简单的英语解释人工智能
Mojo:新型AI语言中的7个令人惊叹的Python升级 编程之美 用简单的英语解释人工智能 编程之美 由Coding Beauty设计的图像,使用Mojo标志和Python标志。 它比C更快,与Python一样简单,但速度提高了35000倍。 进入Mojo:一种…...

TCP连接的三次握手与四次挥手【重点】
TCP的运输连接管理概述 TCP是面向连接的协议,它基于运输连接来传送TCP报文段 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程 TCP运输连接有以下三个阶段 TCP的运输连接管理就是使运输连接的建立和释放都能正常的进行 TCP建立连接的三次握手&a…...

重生奇迹MU新手玩家如何快速熟悉游戏
新手玩家必须掌握什么呢,建议新手玩家去官方网站上面看看游戏的详细介绍,必须要好的熟悉游戏的各种玩法,让玩家可以有一个初步的认识。 所以这方面是非常重要的,建议每位重生奇迹MU玩家都应该注重这些东西。下面我们就来简单介绍…...

MySQL 用户权限和远程访问设置
目录 一、用户操作查看当前拥有用户创建用户修改用户密码删除用户给root用户开放外网访问 二、用户权限操作授予权限的原则查看授予用户的权限给用户添加权限回收权限 一、用户操作 先要使用root用户登录MySQL后在执行后面操作 查看当前拥有用户 SELECT host,user,Grant_pri…...
Golang基础之关键字
Type 参考 ## https://blog.csdn.net/SHELLCODE_8BIT/article/details/122837699 type有如下几种用法: 定义结构体定义接口类型定义类型别名类型查询 类型定义 type Celsius float64 // 摄氏温度 type Fahrenheit float64 // 华氏温度const (AbsoluteZeroC Cels…...
DataFrame插入多列PerformanceWarning: DataFrame is highly fragmented.
DataFrame插入多列PerformanceWarning: DataFrame is highly fragmented. dataframe列比较多,增加列的代码如下: dfpd.DataFrame() for i in range(1000):vlist[]for j in range(1000):vlist.append(j) df[COL_ str(i)] vlistdf警告错误&#x…...

Springboot登录验证的统一拦截处理
在进行Springboot项目开发的时候如何把每次请求都要验证的用户进行提取拦截统一处理 背景 如果不进行统一的拦截处理,其实这是一个非常痛苦的一件事情,因为每次用户请求你都要去进行用户的信息(用户信息存储在session中)的验证&…...

自定义类型详解(上)
结构体 1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag//struct是结构体的标志,tag是标签;名字。 {member-list;//成员变量 }variable-list;//变量列…...
【数据库——MySQL】(9)函数、查询练习及讲解
目录 1. 题目1.1 函数练习1.2 数据库查询 2. 解答2.1 函数练习2.2 数据库查询 1. 题目 1.1 函数练习 求圆周率的值,保留 6 位小数。生成两个 100 到 200 间的随机数。将”武汉大学”,”数学学院”,”计算数学”连接成一个字符串。求字符串中第三个字符为 A 的所有…...

【数据结构与算法——C语言】“串操作与算法”之“找出最长串及其长度”
目录 1. 实验内容及上机实验所用平台1.1 实验内容1.2 实验平台软件 2. 流程图3. 源代码4. 用例测试5. 实验总结 1. 实验内容及上机实验所用平台 1.1 实验内容 【问题描述】 给定两个字符串 s1 和 s2,求最长的 s1 前缀 ss 使得 ss 为 s2 的最长后缀,输出…...

泡泡玛特:一家中国潮玩品牌的出海之旅
泡泡玛特的出海之旅,可以为中国出海企业提供怎样的启示和借鉴? 中国潮玩品牌的出海之旅 如果在年轻人群体中聊起泡泡玛特,那么估计无人不知无人不晓。这家成立于2010年的潮玩企业,凭借琳琅满目让消费者爱不释手的创新产品…...

淘宝商品sku信息抓取接口api
在电商行业中,SKU是一个经常被使用的术语,但是对于很多人来说,这个词可能还比较陌生。在这篇文章中,我们将详细解释什么是SKU,以及在电商业务中它的作用和意义。 什么是SKU? SKU是“Stock Keeping Unit”…...
MySQL 多表关系(多表查询 一)
多表关系描述 MySQL是一种关系型数据库管理系统,它支持多表关系,这在数据库设计和查询中非常重要。 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务…...

【面试高高手】——JavaIO篇(23题)
文章目录 1.什么是Java IO?2.如何从数据传输方式理解IO流?3.Java IO设计上使用了什么设计模式?4.什么是Java NIO?5.什么时BIO?6.什么是AIO?7.你怎么理解同步IO和异步IO?8.你怎么理解阻塞IO和非阻塞IO?9.IO中的输入流和输出流有…...
图像采集 deep OCR
按照芯片类型可以分为CCD相机、CMOS相机 按照传感器的结构特性可以分为线阵相机、面阵相机 按照扫描方式可以分为隔行扫描相机、逐行扫描相机 按照分辨率大小可以分为普通分辨率相机、高分辨率相机按照输出信号方式可以分为模拟相机、数字相机 按照输出色彩可以分为单色(黑白)相…...
Linux 终端命令总结
一、常用的七条命令 命令 对应英文作用lslist查看当前文件夹下的内容pwdprint work directory查看当前所在文件夹cd [目录名]change directory切换文件夹 touch [文件名]touch如果文件不存在新建文件mkdir [目录名]make directory创建目录rm[文件名]remo…...

中国核动力研究设计院使用 DolphinDB 替换 MySQL 实时监控仪表
随着仪表测点的大幅增多和采样频率的增加,中国核动力研究设计院仪控团队原本基于 MySQL 搭建的旧系统已经无法满足大量数据并发写入、实时查询和聚合计算的需求。他们在研究 DB-Engines 时序数据库榜单时了解到国内排名第一的 DolphinDB。经过测试,发现其…...
速看!软考中项100条重要知识点集锦!
1. 项目的特点有哪些? 2. 项目的组织方式有哪些?分别具有什么优缺点? 3. 项目管理过程组有哪些? 4. 怎么样才能成为一位优秀的项目经理? 5. PMO的主要职能有哪些? 6. 项目经理(PMÿ…...

Pycharm在进行debug时出现collecting data如何解决?
Pycharm在进行debug时变量界面出现collecting data,问题如下: 解决方法:打开Setting界面,在Python Debugger选项中勾选下图中的Gevent compatible即可。...

【算法分析与设计】算法概述
目录 一、学习要点二、算法的定义三、算法的性质四、程序(Program)五、问题求解(Problem Solving)六、算法的描述七、算法分析的目的八、算法复杂性分析(一)算法时间复杂性分析(二)算法渐近复杂性1、渐进上界记号-大O符号2、渐进下…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...