• 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
    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)
    • 1

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

    alt

    Mojo来源:Coding Beauty。

    1. 强类型检查

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

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

    数字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
    • 1

    像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)
    • 1

    你可以对任何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
    • 1

    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)
    • 1

    在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')  #没有错误
    • 1

    在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 多平台发布

  • 相关阅读:
    Flink(四)【DataStream API - Source算子】
    基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能
    打包发布自己的app
    讲透计算机网络知识(实战篇)01——计算机网络和协议
    卡尔曼滤波Kalman Filtering:介绍
    动态内存分配——malloc,calloc,realloc,free
    05. Java多线程机制
    js中的变量以及作用域
    flutter,uni-app开发调试ios
    flutter 设置缓存的方法
  • 原文地址:https://blog.csdn.net/qq_40523298/article/details/133220050