Python“王者”地位不保!Julia和Swift后来居上
Python 是20世纪90年代发布的一种通用编程语言。
虽然 Python 语法简洁,但它在第一个十年中并不为人所知,也没有真正进入开发人员的工作中。Perl 是首选的脚本语言,Java 已经成为面向对象编程领域的主流。当然,任何语言的成熟都需要时间,只有当它比现有的工具更适合开发任务时才会被采用。
对于Python来说,这一时间最早出现在21世纪初,那时人们开始意识到它比 Perl 更容易学习,并且提供了与其他语言的互操作性。
这个发现让非常多开发人员将 Python 集成到他们的应用程序中。Django 的出现最终导致了 Perl 的灭亡,Python 开始获得了更多的发展契机。虽然流行程度还比不上比Python更新的 Java 和 JavaScript。
快进到现在,根据2019年 StackOverflow 开发者调查,Python 已经超越 Java 成为第二流行的编程语言。
Python 是最近十年发展最快的编程语言。Python 的流行与20世纪10年代大数据的出现以及机器学习和人工智能的发展密不可分。企业迫切需要一种能够帮助管理大规模数据和科学计算任务的低门槛快速开发语言。Python 非常适合这些领域的挑战任务。
除了这些有利因素之外,Python 是一种支持动态类型的解释语言。更重要的是,它得到了 Google 的支持,Google 投资开发了Python的深度学习框架 Tensorflow,这让 Python 得以成为数据分析、可视化和机器学习的首选语言。
然而,虽然机器学习和人工智能的需求还在不断增长,但是 Python 不会一直都站在巅峰,它也会有老去的一天。像每种编程语言一样,Python 也有自己的弱点。这些弱点让 Python 很容易被更适合企业需求的编程语言所取代。虽然已经有 R 语言了,但是 Swift、Julia 和 Rust 等较新语言的出现实际上对当前的数据科学之王构成了更大的威胁。
Rust 还在努力追赶着各大机器学习社区的步伐,因此,我相信 Swift 和 Julia 将是推翻 Python 并最终统治数据科学的语言。
Python缺乏类型安全性,速度非常慢
所有的好东西都是有代价的,Python的动态类型特性也不例外。动态类型化可以在不定义类型的情况下,让快速编写代码变得更加容易,但是,这会增加代码运行时产生 BUG 的风险,特别是当代码库大小增加时,开发人员在生产环境中运行代码时会更加艰难。编译器很容易发现的 BUG,在 Python 中反而无法识别,这样就会产生开发障碍,最终导致大规模应用程序的开发过程放慢。
更糟糕的是,与编译的代码不同,Python 的解释器在执行时要分析每一行代码。与其他语言相比,不仅导致开销变大,还大大降低了程序的性能。
Julia 可以让你避免这些问题。尽管它是动态类型的,但它有一个实时编译器。JIT 编译器要么在执行前生成机器代码,要么使用先前存储的缓存编译,这能让 Julia 与静态类型语言一样具有优秀的性能。更重要的是,它有一个称为多分派的关键特性,类似于 OOPs 的函数重载,虽然只能在运行程序的时候有用。多分派的强大之处在于它能够处理不同的参数类型,而无需创建单独的函数名或嵌套的 if 语句。这个功能不仅可以帮助开发人员编写更加紧凑的代码,也是数值计算的一大胜利,因为与 Python 有所不同,我们可以轻松地通过扩展解决方案来处理所有类型的参数。
还有更好,那就是,Swift 作为一种静态类型的语言,因其 LLVM(低级虚拟机)编译器而得到了高度优化。LLVM 让快速编译成汇编代码成为可能,这能让 Swift 超高效运行,达到了几乎与 C 语言一样快的速度。此外,Swift 拥有更好的内存安全和管理工具,即自动引用计数。与 garbage 收集器不同,ARC 具有更高的确定性,因为只要引用计数归零,它就会回收内存。
作为提供类型注释的编译语言,Swift 和 Julia 比 Python 更快,功能更强大。仅仅这一点,可能就足以让开发人员推荐它们,而不是使用较旧的语言,考虑很多其他因素。
Python在并行性方面有局限性
如果说慢不是 Python 很明显的缺点,那么这种语言在并行计算方面的局限性绝对是最明显的缺点了。
简而言之,Python 使用 GIL(全局解释器锁),它会通过阻止多个线程同时执行,来提高单个线程的性能。该过程有一个很大的障碍:开发人员不能使用多个 CPU 核心来进行密集的计算。
在此,我必须要同意一个观点,即在利用 Python 与 Tensorflow、PyTorch 等 C / C ++ 库的互操作性时,我们目前已经做得很好了。 但是 Python 包装器并不能解决所有调试问题。当检查底层代码时,我们还是要依赖于 C 和 C ++。 从本质上讲,我们不能在低层次上利用 Python 的优势,这也是 Python 与众不同之处。
这一因素很快将决定 Python 的衰落、Julia 和 Swift 的崛起。Julia 是一种专门用来解决 Python 缺点的语言。它主要提供三个特性:协同程序(异步任务)、多线程和分布式计算,所有这些特性都显示并发和并行编程有无限可能。这种结构使 Julia 能够以比 Python 更快的速度执行科学计算和解决大数据问题。
另一方面,Swift 拥有开发移动应用所需的所有工具,在并行计算方面没有问题。
Swift和Julia都拥有Python的互操作性和强大的支持
虽然 Python 在速度、多线程和类型安全方面存在缺点,但它拥有一个巨大的生态系统,拥有大量的库和包。在Python面前,Swift和Julia在机器学习领域仍然是婴儿,他们拥有的库数量非常有限。然而,它们与 Python 的互操作性弥补了 Julia 和 Swift 中缺少库支持的不足。
Julia 不仅允许程序员使用 Python 代码(反之亦然),还支持与 C、R、Java 以及几乎所有主要编程语言的互操作性。这种多功能性肯定会给这种语言一个很好的推动,并增加它在数据科学家中被迅速采用的机会。
另一方面,Swift 通过 PythonKit 库提供了与 Python 的互操作性。Swift(起源于苹果)比较大的卖点是它得到了谷歌(Google)的大力支持,谷歌几十年前就全力支持 Python。
另外,Swift 的创建者 chrislattner 现在正在谷歌的 AI brain 团队工作,这一事实表明 Swift 正在被培养成机器学习领域 Python 的替代者。Tensorflow 团队通过 S4TF 项目投资了 Swift,这进一步证明了该语言不仅仅是 Python 的包装器。相反,Swift 凭借其差异化的编程支持和像 C 一样的低级工作能力,将有可能被用来取代底层的深度学习工具。
结论