上世纪90年代,Python作为一种通用编程语言诞生了。尽管语句简洁,Python在最初十年的使用情况却并不乐观,它也没能真正成为开发者使用的编程语言。当时,Perl是编程首选,Java已在面向对象编程领域站稳脚跟。

当然,一切编程语言都需要一定的成熟时间,只有它比现有工具更适合编程,才会被广泛使用。Python在21世纪初期的第一个机遇就是,人们意识到Python的学习曲线比Perl简单,还能与其他语言互相操作。这种特性让大量开发者使用Python编程。Django的出现终结了Perl, Python势头更猛了,但仍然无法与其“后辈”Java和JavaScript相提并论。

快进到现在,2019年StackOverflow开发者年度调查报告显示,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在数据科学中的地位将逐渐降低,专门为深度学习而设计的语言才是未来主流。

python全局解释器锁 tensorflow_Python即将出局?Julia和Swift能取而代之吗?相关推荐

  1. Python培训教程:什么是Python全局解释器锁(GIL)?

    本期Python培训教程小编为大家带来的是关于"什么是Python全局解释器锁(GIL)?"的问题,全局解释器锁是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时 ...

  2. python gil全局锁_什么是Python全局解释器锁(GIL)?

    python gil全局锁 The Python Global Interpreter Lock or GIL, in simple words, is a mutex (or a lock) tha ...

  3. python全局解释器锁 tensorflow_想轻松复现深度强化学习论文?看这篇经验之谈

    近期深度强化学习领域日新月异,其中最酷的一件事情莫过于 OpenAI和 DeepMind 训练智能体接收人类的反馈而不是传统的奖励信号.本文作者认为复现论文是提升机器学习技能的最好方式之一,所以选择了 ...

  4. Python全局解释器锁GIL与多线程

    Python中如果是 I/O密集型的操作,用多线程(协程Asyncio.线程Threading),如果I/O操作很慢,需要很多任务/线程协同操作,用Asyncio,如果需要有限数量的任务/线程,那么使 ...

  5. python 全局解释器锁_python全局解释器锁(GIL)

    什么是全局解释器锁GIL 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译 ...

  6. Python全局解释器锁(GIL)

    目录 1.引言 2.GIL存在的背景 3.GIL主要工作原理 4.Python 线程安全问题 5.可以如何绕过 GIL? 6.延伸阅读 1.引言 我们来看下Python 多线程另一个很重要的话题--G ...

  7. python3.5全局解释器锁GIL-实现原理浅析

    python3全局解释器锁浅谈 本文环境python3.5.2. python全局解释器锁 In CPython, the global interpreter lock, or GIL, is a ...

  8. python开发线程:线程守护线程全局解释器锁

    From: https://www.cnblogs.com/jokerbj/p/7460260.html 一 threading模块介绍 multiprocess模块的完全模仿了threading模块 ...

  9. Python中的GIL(全局解释器锁)

    1. GIL全称Global Interpreter Lock,每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码. 2.GIL的缺点 GIL使Python不能充分利用多核心 ...

最新文章

  1. esl8266开发之旅_从ESL老师到越南软件开发人员的旅程
  2. MySQL和Oracle中的隐式转换
  3. Signalr实时通讯
  4. 微服务化之服务拆分与服务发现
  5. 微信搜一搜产品团队:三大能力助力内容优质呈现、品牌精细增长、服务精准触达
  6. python读音检测-python – 一个音符的录音音频会产生多个发音时间
  7. vue.js实现自定义输入分页
  8. 第四堂:Java程序运行期数据区
  9. 数据结构之二叉查找树介绍
  10. 基于RV1126平台imx291分析 --- open及media graph分析
  11. 微信小程序入门9-微信开放平台unionId机制介绍
  12. 使用VC 编程改变字体 注意点--需要设置GB2312—CHARSET
  13. 安卓手机如何防盗_如何使用IMEI号码追踪丢失的安卓(Android)手机
  14. flashpaper java_基于FlashPaper实现JSP在线阅读代码示例
  15. Linux添加PCF8563 RTC支持
  16. PTA 6-1 快速排序 (10分)
  17. 用户满意您的产品吗?20个用户体验调查问题给您答案
  18. Java - 反射机制
  19. SysML实践指南第二版(中文翻译:刘亚龙)第17章 OOSEM方法学
  20. php 项目操作日志文件,什么是操作日志?关于操作日志实例用法汇总

热门文章

  1. Windows环境下Docker常用命令
  2. BootStrap中的日期时间组件datetimepicker
  3. 服务器返回的数据把标签转义为其它字符
  4. python调用os.system启动anaconda环境_在Mac中PyCharm配置python Anaconda环境过程图解
  5. jnativecpp.dll一定要放到系统目录下吗_「实用」室内甲醛到底该如何去除?关键要做到这两点...
  6. MySQL备份-mysqldump命令
  7. html toast屏幕中间,Toast.html
  8. python调用c++动态库_Python应用:调用C/C++动态链接库的方法详解
  9. Java中判断字符串是否为数字
  10. MySQL Workbench工具设置编码