本文探讨了Python语言在AI领域的优势与运用。
谁会成为AI 和大数据时代的第一开发语言?
这本已是一个不需要争论的问题。如果说三年前,Matlab、Scala、R、Java 和 Python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明确了,特别是前两天 Facebook 开源了 PyTorch 之后,Python 作为 AI 时代头牌语言的位置基本确立,未来的悬念仅仅是谁能坐稳第二把交椅。
不过声音市场上还有一些杂音。最近一个有意学习数据科学的姑娘跟我说,她的一个朋友建议她从 Java 入手,因为 Hadoop 等大数据基础设施是用 Java 写的。
无独有偶,上个月 IBM developerWorks 发表的一篇个人博客(https://www.ibm.com/developerworks/community/blogs/jfp/entry/What_Language_Is_Best_For_Machine_Learning_And_Data_Science?lang=en),用职位招聘网站indeed 上的数据做了一个统计。
这篇文章本身算得上是客观公正,实事求是,但传到国内来,就被一些评论者曲解了本意,说 Python 的优势地位尚未确立,鹿死谁手尚未可知,各位学习者不可盲目跟风啊,千万要多方押宝,继续撒胡椒面不要停。
在这里我要明确表个态,对于希望加入到 AI 和大数据行业的开发人员来说,把鸡蛋放在 Python 这个篮子里不但是安全的,而且是必须的。
或者换个方式说,如果你将来想在这个行业混,什么都不用想,先闭着眼睛把 Python 学会了。
当然,Python不是没有它的问题和短处,你可以也应该有另外一种甚至几种语言与 Python 形成搭配,但是Python 将坐稳数据分析和 AI 第一语言的位置,这一点毫无疑问。
我甚至认为,由于 Python 坐稳了这个位置,由于这个行业未来需要大批的从业者,更由于Python正在迅速成为全球大中小学编程入门课程的首选教学语言,这种开源动态脚本语言非常有机会在不久的将来成为第一种真正意义上的编程世界语。
讨论编程语言的优劣兴衰一直被认为是一个口水战话题,被资深人士所不屑。但是我认为这次 Python 的上位是一件大事。
请设想一下,如果十五年之后,所有40岁以下的知识工作者,无分中外,从医生到建筑工程师,从办公室秘书到电影导演,从作曲家到销售,都能使用同一种编程语言进行基本的数据处理,调用云上的人工智能 API,操纵智能机器人,进而相互沟通想法,那么这一普遍编程的协作网络,其意义将远远超越任何编程语言之争。目前看来,Python 最有希望担任这个角色。
Python 的胜出令人意外,因为它缺点很明显。
它语法上自成一派,让很多老手感到不习惯;“裸” Python 的速度很慢,在不同的任务上比C 语言大约慢数十倍到数千倍不等;由于全局解释器锁(GIL) 的限制,单个Python 程序无法在多核上并发执行;Python 2 和 Python 3 两个版本长期并行,很多模块需要同时维护两个不同的版本,给开发者选择带来了很多不必要的混乱和麻烦;由于不受任何一家公司的控制,一直以来也没有一个技 术巨头肯死挺 Python 。
所以,相对于 Python 的应用之广泛,其核心基础设施所得到的投入和支持其实是非常薄弱的。
直到今天,26岁的Python 都还没有一个官方标配的 JIT 编译器,相比之下, Java 语言在其发布之后头三年内就获得了标配 JIT 。
另一个事情更能够说明问题。Python 的 GIL 核心代码 1992 年由该语言创造者 Guido van Rossum 编写,此后十八年时间没有一个人对这段至关重要的代码改动过一个字节。
十八年!直到2010年,Antoine Pitrou才对 GIL 进行了近二十年来的第一次改进,而且还仅在 Python 3.x 版本中使用。这也就是说,今天使用 Python 2.7 的大多数开发者,他们所写的每一段程序仍然被26年前的一段代码牢牢制约着。
说到 Python 的不足,我就想起发生在自己身上的一段小小的轶事。我多年前曾经在一篇文章里声明自己看好 Python,而不看好 Ruby。
大概两年多以前,有一个网友在微博里找到我,对我大加责备,说因为当年读了我这篇文章,误听谗言,鬼迷心窍,一直专攻 Python,而始终对 Ruby 敬而远之。
结果他Python 固然精通,但最近一学 Ruby,如此美好,如此甜蜜,喜不自胜,反过来愤然意识到,当年完全被我误导了,在最美的年华错过了最美的编程语言。
我当时没有更多的与他争辩,也不知道他今天是否已经从Python后端、大数据分析、机器学习和 AI 工程师成功转型为Rails快速开发高手。我只是觉得,想要真正认识一件事物的价值,确实也不是一件容易的事情。
Python 就是这样一个带着各种毛病冲到第一方阵的赛车手,但即便到了几年前,也没有多少人相信它有机会摘取桂冠,很多人认为 Java 的位置不可动摇,还有人说一切程序都将用 JavaScript重写。
但今天我们再看,Python 已经是数据分析和 AI的第一语言,网络攻防的第一黑客语言,正在成为编程入门教学的第一语言,云计算系统管理第一语言。
Python 也早就成为Web 开发、游戏脚本、计算机视觉、物联网管理和机器人开发的主流语言之一,随着 Python 用户可以预期的增长,它还有机会在多个领域里登顶。
而且不要忘了,未来绝大多数的 Python 用户并不是专业的程序员,而是今天还在使用 Excel、PowePoint、SAS、Matlab和视频编辑器的那些人。
就拿 AI 来说,我们首先要问一下,AI 的主力人群在哪里?如果我们今天静态的来谈这个话题,你可能会认为 AI 的主力是研究机构里的 AI 科学家、拥有博士学位的机器学习专家和算法专家。
但上次我提到李开复的 “AI红利三段论”明确告诉我们,只要稍微把眼光放长远一点,往后看三至五年,你会看到整个 AI 产业的从业人口将逐渐形成一个巨大的金字塔结构,上述的 AI 科学家仅仅是顶端的那么一点点,95% 甚至更多的 AI 技术人员,都将是AI 工程师、应用工程师和AI 工具用户。
我相信这些人几乎都将被Python 一网打尽,成为 Python 阵营的庞大后备军。
这些潜在的 Python 用户至今仍然在技术圈子之外,但随着 AI 应用的发展,数百万之众的教师、公司职员、工程师、翻译、编辑、医生、销售、管理者和公务员将裹挟着各自领域中的行业知识和数据资源,涌入 Python 和 AI 大潮之中,深刻的改变整个 IT,或者说 DT (数据科技)产业的整体格局和面貌。
为什么 Python 能够后来居上呢?
如果泛泛而论,我很可以列举 Python 的一些优点,比如语言设计简洁优雅,对程序员友好,开发效率高。但我认为这不是根本原因,因为其他一些语言在这方面表现得并不差。
还有人认为 Python 的优势在于资源丰富,拥有坚实的数值算法、图标和数据处理基础设施,建立了非常良好的生态环境,吸引了大批科学家以及各领域的专家使用,从而把雪球越滚越大。
但我觉得这是倒因为果。为什么偏偏是 Python 能够吸引人们使用,建立起这么好的基础设施呢?为什么世界上最好的语言 PHP 里头就没有 numpy 、NLTK、sk-learn、pandas 和 PyTorch 这样级别的库呢?为什么 JavaScript 极度繁荣之后就搞得各种程序库层次不齐,一地鸡毛,而 Python 的各种程序库既繁荣又有序,能够保持较高水准呢?
我认为最根本的原因只有一点:Python 是众多主流语言中唯一一个战略定位明确,而且始终坚持原有战略定位不动摇的语言。相比之下,太多的语言不断的用战术上无原则的勤奋去侵蚀和模糊自己的战略定位,最终只能等而下之。
Python 的战略定位是什么?其实很简单,就是要做一种简单、易用但专业、严谨的通用组合语言,或者叫胶水语言,让普通人也能够很容易的入门,把各种基本程序元件拼装在一起,协调运作。
正是因为坚持这个定位,Python 始终把语言本身的优美一致放在奇技妙招前面,始终把开发者效率放在CPU效率前面,始终把横向扩张能力放在纵向深潜能力之前。长期坚持这些战略选择,为 Python 带来了其他语言望尘莫及的丰富生态。
比如说,任何一个人,只要愿意学习,可以在几天的时间里学会Python基础部分,然后干很多很多事情,这种投入产出比可能是其他任何语言都无法相比的。
再比如说,正是由于 Python 语言本身慢,所以大家在开发被频繁使用的核心程序库时,大量使用 C 语言跟它配合,结果用 Python 开发的真实程序跑起来非常快,因为很有可能超过 80% 的时间系统执行的代码是 C 写的。
相反,如果 Python 不服气,非要在速度上较劲,那么结果很可能是裸速提高个几倍,但这样就没人有动力为它开发 C 模块了,最后的速度远不如混合模式,而且很可能语言因此会变得更复杂,结果是一个又慢又丑陋的语言。
更重要的是,Python 的包装能力、可组合性、可嵌入性都很好,可以把各种复杂性包装在 Python 模块里,暴露出漂亮的接口。
很 多时候,一个程序库本身是用 C/C++ 写的,但你会发现,直接使用 C 或者 C++ 去调用那个程序库,从环境配置到接口调用,都非常麻烦,反而隔着一层,用其python 包装库更加清爽整洁,又快又漂亮。这些特点到了 AI 领域中,就成了 Python 的强大优势。
Python 也借助 AI 和数据科学,攀爬到了编程语言生态链的顶级位置。Python 与 AI绑在一起,对它们来说,无论是电子商务、搜索引擎、社交网络还是智能硬件,未来都只是生态链下游的数据奶牛、电子神经和执行工具,都将听命于自己。
对编程语言发展历史缺乏了解的人可能会觉得,Python 的战略定位是犬儒主义和缺乏进取心的。但事实证明,能同时做到简单而严谨、易用而专业,是很难的,而能够坚守胶水语言的定位,更是难上加难。
有的语言,从一开始就是出于学术而非实用的目的,学习曲线过于陡峭,一般人很难接近。
有的语言,过于依赖背后金主的商业支持,好的时候风光无限,一旦被打入冷宫,连生存下去都成问题。
有的语言,设计的时候有明确的假想场景,要么是为了解决大规模并发,要么是为了解决矩阵运算,要么是为了做网页渲染模板,一旦离开这个场景,就各种不爽。
更多的语言,刚刚取得一点成功,就迫不及待的想成为全能冠军,在各个方向上拼命的伸展触角,特别是在增强表达能力和提升性能方面经常过分积极,不惜将核心语言改得面目全非,最后变成谁都无法掌控的庞然大物。
相比之下,Python 是现代编程语言设计和演化当中的一个成功典范。
Python 之所以在战略定位上如此清晰,战略坚持上如此坚定,归根结底是因为其社区构建了一个堪称典范的决策和治理机制。
这个机制以 Guido van Rossum (BDFL,Pythoners 都知道这是什么意思), DavidBeazley, Raymond Hettinger 等人为核心,以 PEP 为组织平台,民主而有序,集中而开明。只要这个机制本身得以维系,Python 在可见的未来里仍将一路平稳上行。
最有可能向 Python 发起挑战的,当然是Java。Java 的用户存量大,它本身也是一种战略定位清晰而且非常坚定的语言。
但我并不认为 Java 有很大的机会,因为它本质上是为构造大型复杂系统而设计的。什么是大型复杂系统?就是由人清清楚楚描述和构造出来的系统,其规模和复杂性是外生的,或者说外界赋予的。
而 AI 的本质是一个自学习、自组织的系统,其规模和复杂性是一个数学模型在数据的喂养下自己长出来的,是内生的。
因此,Java大多数的语言结构对于大数据的处理和 AI 系统的开发显得使不上劲,你强的东西这里用不上,这里需要的东西你做起来又别扭。
而 Python 在数据处理方面的简洁强悍早就尽人皆知。对比两个功能相同的 Java 和 Python 机器学习程序,正常人只要看两眼就能做出判断,一定是 Python 程序更加清爽痛快。
大概在 2003 或者 2004 年的时候,我买过一本 Python 的书,作者是一位巴西人。他说自己之所以坚定的选择 Python,是因为他小时候经常梦到未来世界将由一条大蟒蛇(蟒蛇的英文为python)统治。
我当时觉得这哥们好可怜,做个梦都能梦到这么恐怖的场景。但今天来看,也许他只是像黑客帝国里的程序员安德森一样,不小心穿越到未来,并且窥探到了世界的真相。