上世纪90年代,Python作为一种通用编程语言诞生了。尽管语句简洁,Python在最初十年的使用情况却并不乐观,它也没能真正成为开发者使用的编程语言。当时,Perl是编程首选,Java已在面向对象编程领域站稳脚跟。
当然,一切编程语言都需要一定的成熟时间,只有它比现有工具更适合编程,才会被广泛使用。Python在21世纪初期的第一个机遇就是,人们意识到Python的学习曲线比Perl简单,还能与其他语言互相操作。这种特性让大量开发者使用Python编程。Django的出现终结了Perl, Python势头更猛了,但仍然无法与其“后辈”Java和JavaScript相提并论。
快进到现在,2019年*开发者年度调查报告显示,Python已超越Java成为第二受欢迎的语言。
Python还是10年来发展速度最快的编程语言。Python的普及很大程度上得益于2010年大数据的出现及机器学习、人工智能的发展。企业迫切需要发展迅速、门槛低的编程语言以管理大规模数据和科学计算任务,而Python能完美解决这些问题。
除了以上优势,Python还是一种动态类型的解释型语言。更重要的是,它得到了Google的支持,后者为Tensorflow购买了Python,这使其成为数据分析、可视化和机器学习的首选语言。
然而,尽管对机器学习和人工智能的需求在新十年也将不断增加,但Python的好景却不长了。如同其它编程语言一般,Python本身也有缺陷。这些缺陷让它能轻易被其它更适合完成企业常规任务的语言所取代。哪怕有R语言坐镇,Swift、Julia和Rust等新编程语言的出现也对数据科学的现任王者构成了极大威胁。
Rust仍在努力适配机器学习,所以我认为Swift和Julia是取代Python并最终统治数据科学的语言。一起来看看Python面临的困境吧。
Python缺乏类型安全性,运行速度非常慢
图源:unsplash
所有的好事都要付出代价,Python的动态类型化也不例外。动态类型可以轻松快速地编写代码而无需定义类型。然而,尤其是当代码库变大时,代码运行更容易出问题,开发人员在生产环境中运行代码时会更艰难。编译器很容易发现的 BUG,在Python中反而无法识别,这样就会产生开发障碍,最终降低大规模应用程序的开发速度。
更糟糕的是,不同于编译代码,Python的解释程序每次执行时都要分析每行代码。相比于其它语言,Python开销更大,程序性能低得多。
而Julia能避免上述问题。Julia虽是动态类型语言,但是它有实时编译器。其JIF编译器要么就是在执行前生成正确的机器代码,要么就是使用先前已储存、缓存的编译,这让它拥有与静态类型语言一样的性能。
更重要的是,Julia有一个称为多分派的关键特性,类似于OOPs的函数重载(虽然仅能用于运行程序)。多分派的强大之处在于它能够处理不同的参数类型,而无需创建单独的函数名或嵌套的if语句。这有助于编写更加紧凑的代码,也是数值计算的一大胜利,它可以轻松地通过扩展解决方案来处理所有类型的参数。
Swift甚至更胜一筹。Swift是静态类型语言,LLVM编译器(低级虚拟机器)对其进行了高度优化。它能快速编译成汇编代码,这让Swift超高效运行,速度可比拟C语言。
此外,Swift拥有更好的内存安全和管理工具,即自动引用计数(Automatic Reference Counting)。与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有一切开发移动应用所需的工具,能够进行并行计算。
图源:unsplash
Swift和Julia都拥有Python的互操作性和强大的支持
虽然在速度、多线程和类型安全方面有不足之处,但Python有包含大量库和程序包的巨型生态系统。在Python面前,Swift和Julia在机器学习领域仍然是个“弟弟”,拥有的库数量非常有限。然而,Julia和Swift比Python更强的互操作性大大弥补了二者库支持的不足的缺点。
Julia不仅允许程序员使用Python代码(反之亦然),还能与C语言、R语言、Java以及几乎所有主要编程语言的进行互操作。这种多功能性能有力推动这种语言的发展,增加它被数据科学家迅速采用的机会。
另一方面,Swift通过PythonKi 库提供了与Python的互操作性。Swift(起源于苹果)最大的卖点是它得到了谷歌的大力支持,十几年前收益于全力支持而崛起的正是Python,可真是风水轮流转。
另外,Swift的创建者Chris Lattner正在谷歌的AI brain团队工作,这表明Swift正在被重点培养,以在机器学习领域的取代Python。
Tensorflow团队通过S4TF项目投资了Swift,这进一步证明了该语言不仅仅是Python的修饰版。相反,Swift 凭借其差异化的编程支持和像C语言一样的低层级工作能力,将有可能被用来取代支撑深度学习的工具。
图源:unsplash
随着数据量的不断增加,Python的致命弱点很快就会浮现。注重易用性和快速编码能力的日子一去不复返,速度和并行计算才是游戏的主角。Python 作为一种通用语言,将不再解决这些问题。Python终会退场,而Julia和Swift似乎就是候选接任者。
不过,我并不是说作为编程语言的Python会立刻消失,它会一点一点淡出人们的视线。Python在数据科学中的地位将逐渐降低,专门为深度学习而设计的语言才是未来主流。