|
NLNQqwyU
| 未知
这个,Python还是有不少优势的:
开源,跨平台。社区。不要小看这一点。社区意味着有很多教程、书籍,出了问题很容易google到,乃至更好的IDE支持。
当然,你会说上面这些优势Java和C++也有。实际上,Java的社区可能比Python大,至少Java的IDE比Python强(你可以自行对比下IntelliJ和PyCharm)。
那么我们来说些Python独特的优势:
语法设计的优雅。你可以说这些只是一些皮毛,无关痛痒。但这些皮毛其实是语言的“用户界面”。Java的语法是否优雅有争议,而C++的语法……内存安全性。人工智能开发不应该操心指针错误这样的问题。当然Java不存在这个问题。平滑的学习曲线。开发人工智能的人不一定都是程序员,很多学术界和从事数据分析的人并不熟悉C++。当然他们也可能不熟悉Python。但入门Python和入门C++的难度不可同日而语。表达效率。Java和C++还是比较啰嗦的。虽然说靠谱的IDE可以自动生成代码,但这只是节省了打字的开销,而代码大部分时间是用来读的,而不是用来写的。历史积累。人工智能涉及很多科学计算、数据可视化的任务。这方面,Python有非常优质的库,比如,numpy和pandas在别的语言里没有级别相当的替代品。
另外,速度其实并不是一个大问题。因为实际上你不一定真的在写Python.
比如,我们看以下TensorFlow代码的示例:- [/code]上面这段代码,明显是Python(这还用说?)。
- 但是,仔细看看,真的是Python吗?
- 实际上,这些代码[b]构建了一个图m[/b],然后通过tf.Session()的run方法[b]运行了图m[/b]。
- 下面一段代码可能更明显,我们想迭代数据集dataset,在TensorFlow下需要这样写:
- [code]
复制代码 我们看到,我们不能直接使用Python迭代数据集,而要通过TensorFlow提供的方法构建迭代器。
这一情况可以类比使用Python访问SQL数据库:- [/code]这里,我们构造了SQL请求语句,然后通过Python“执行”(execute)这些语句。表面上你在写Python,其实关键的逻辑在SQL语句里。更准确地说,你是在用Python构造SQL语句,然后运行构造的语句。这称为[b]元编程(meta programming)[/b]。
- 同理,在TensorFlow下,表面上你在写Python,其实关键的逻辑都在TensorFlow图里。更准确地说,你是在用Python构造TensorFlow图,然后运行构造的图。
- 实际上,2017年万圣节(10月31日),Google发布了TensorFlow Eager Execution(贪婪执行),让你可以直接使用Python编程,而不是使用Python元编程TensorFlow图。
- 使用Eager Execution,上面两段TensorFlow代码可以改写为:
- [code]
复制代码 你看,TensorFlow明明可以“好好地”用Python编程的嘛。之前为什么要这么大费周折地绕一个圈子?
因为性能。
机器学习,尤其是现代的复杂模型,有着极高的算力需求。TensorFlow图可以很好地应对贪婪的算力需求,而Python则对此力不从心。
TensorFlow图专门针对机器学习的需求设计,所以可以很好地优化,以提升性能。
所以说,你其实大部分时间是在用Python进行元编程,并不需要操心Python的性能问题。
当然,天下没有免费的午餐。为了更好地优化,TensorFlow图对模型有着许多假设(这些假设从另一方面来说也是限制),也要求构造、运行分阶段进行(静态图模型)。这影响了模型的灵活性和表达力。
而像PyTorch这样支持动态图模型,更Pythonic的框架,为了优化性能可以说是煞费苦心,但仍有不足。
所以,Google Brain挖了Swift之父Chris Lattner做Swift For TensorFlow(上个月底刚刚开源),就是为了兼顾性能和灵活性。
Swift For TensorFlow对动态图模型代码进行分析,自动生成对应的TensorFlow图程序。
图程序提取(黄色方框)是Swift For TensorFlow的关键技术
上图中的model.swift没法换成model.py,因为Python那一大堆动态特性,使得Python无法被可靠地静态分析。
顺便说下题主关心的Java和C++。
model.java也不行,因为Java虽然是静态语言,但动态分发(dynamic dispatch)非常普遍。换句话说,Java主要的高层抽象手段,类和接口,都高度依赖动态分发。
model.cpp也许可以。但是,基于前面说过的C++的问题,C++没有机会。
总之,Python有一些主客观优势,再加上一些历史因素,成为当前人工智能的主流语言。但优势还没有大到和人工智能是“天作之合”的程度。而以后随着人工智能技术的发展,Python也未必能保持这个AI/ML主流语言的地位。
没有说人工智能要钦定Python,没有任何这个意思。但你一定要问Python到底有什么优势,它现在是人工智能的主流语言,怎么能没有优势? |
|