我只想知道为什么机器学习工程师和 AI 程序员使用 Python 之类的语言而不是 C++ 来执行 AI 任务,尽管 C++ 在技术上比 Python 更强大。
为什么 C++ 在 AI 中的使用似乎不如 Python 广泛?
您不需要强大的语言来编写 AI。大多数开发人员都在使用 Keras、Torch、Caffe、Watson、TensorFlow 等库。这些低级库经过高度优化,可以处理所有艰巨的工作。它们是用高性能语言构建的,如 C、C++。Python 仅用于高级任务,例如描述神经网络层、加载数据、启动处理和显示结果。
将 C++ 用于高级任务而不是 Python 几乎不会带来任何性能改进,但对于非开发人员来说会更难,因为它需要关心内存管理。此外,一些 AI 人员可能没有非常扎实的编程或计算机科学背景。
另一个类似的例子是游戏开发,其中引擎是用 C/C++ 编码的,而且通常所有的游戏逻辑都用高级语言编写脚本。
C++ 实际上是 AI/ML 领域最流行的语言之一。一般来说,Python 可能更受欢迎,但正如其他人所指出的,混合系统实际上很常见,其中 CPU 密集型数字运算在 C++ 中完成,Python 用于更高级别的函数。
只是为了说明:
这取决于它需要有多灵活:如果您有一个成熟的系统可以投入生产,不需要太多调整,那么 C++(甚至 C)可能就可以了。您需要花费大量时间来构建软件,但它应该运行得非常快。
但是,如果您仍在尝试设置和参数,并且可能需要调整架构,那么 C++ 将难以使用。您需要一种像 Python 这样的语言,它可以更轻松地进行更改。更改代码更容易,因为您通常可以使用 Python 等语言更快地编写代码。您付出的代价是该软件通常性能不佳。
您需要决定这种权衡如何最适合您。通常最好在编码上花费更少的时间,而不必过多担心更长的运行时间。如果你少花一天时间来完成你的代码,那么 C 编码的版本需要很多时间才能赶上。大多数时候只是不值得。
一种常见的方法似乎是混合系统,其中核心库是用 C/C++ 实现的,因为它们不需要太多改变,而前端/胶水/接口是在 Python 中,因为你需要灵活性和速度不是那个关键。
顺便说一句,这不是 AI 特有的问题,而是解释语言与编译语言的一般问题。有了人工智能,许多系统仍然专注于研究而不是应用,这就是开发速度胜过执行速度的地方。
你声称
C++ 在技术上是一种比 python 更强大的语言。
但这种说法是错误的(或意义不大)。请记住,编程语言是一种规范(通常是一些用英语编写的文档)。例如,n3337是 C++ 规范的后期草案。我不喜欢 Python,但它看起来确实比 C++ 强大(即使 C++实现通常比 Python 更快):一个好的 Python 程序员可以用 Python 很好地编码,另一个好的 C++ 程序员可以用 C++ 很好地编码,反之亦然反之亦然。
从理论上讲,C++ 和 Python 都是图灵完备(有意)的编程语言。
Python 和 C++ 一样富有表现力。我无法命名 Python 具有但 C++ 没有的编程语言功能(与反射相关的功能除外;另请参阅此答案并注意dlopen
- 参见我的manydl.c程序 - LLVM、libgccjit、libbacktrace,并考虑一些元- 使用他们的编程方法,à la Bismon或像J.Pitrat 的博客所提倡的那样)。
也许您将编程语言视为实现它的软件。然后 Python 和 C++ 一样富有表现力(而且似乎更容易学习,但这是一种错觉;有关这种错觉的更多信息,请参见http://norvig.com/21-days.html)。Python 和 C++ 具有非常相似的语义,即使它们的语法非常不同。它们的类型系统非常不同。
可悲的是,许多最近的主要机器学习库(例如TensorFlow或Gudhi,都主要使用 C++ 编写)实际上在 Python 中比在 C++ 中更易于使用。但是您可以在 C++ 代码中使用 TensorFlow 或 Gudhi,因为TensorFlow 和 Gudhi 大多是用 C++ 编码的,并且都提供和记录 C++ API(不仅仅是 Python API)。
C++ 支持多线程编程,但通常的 Python 实现有其GIL,是字节编码的,因此比 C++ 慢得多(通常通过优化编译器如GCC或Clang编译;但是你可以找到 C++ 解释器,例如Cling)。Python 的一些实验性实现是JIT 编译的,没有 GIL。但这些都不成熟:我建议投资一百万欧元来增加他们的TRL。
还要注意 C++ 比 Python 更难学习。即使有十几年的 C++ 编程经验,我也不能声称真正了解 C++ 的大部分内容。
可悲的是,最近教授 AI 软件工程的书籍(例如这本或那本)都使用 Python(而不是 C++)作为示例。我实际上想要更多最新的使用 C++ 的 AI 书籍!
顺便说一句,我使用 AI 技术编写开源软件(比如这个,或者过时的GCC MELT),但他们不使用 Python。我对 AI 应用程序的方法是开始在其中设计一些DSL。
一些人工智能方法涉及元编程,例如自己生成系统的一些(或大部分,甚至全部)代码。J.Pitrat(他于 2019 年 10 月去世)率先采用了这种方法。请参阅他的博客、他的 CAIA 系统、阅读他的人造人、一本 couscious 机器的良心书 (ISBN 978-1848211018) 和RefPerSys项目(其目标是生成大部分(希望是所有)其 C++ 代码)。
在 Linux 等操作系统上,您实际上可以在运行时生成 C++(或 C)代码并将其(使用GCC)编译成插件,然后使用dlopen(3)生成插件,并使用dlsym( 3)。请参阅manydl.c示例(在 2020 年功能强大的桌面上,如果您运行该示例几天,您将能够生成和加载 50 万个插件)。使用dladdr(3)和 Ian Taylor 的libbacktrace,您还可以检查一些调用堆栈。
AFAIK 大公司(例如 Google)在内部使用 C++ 编写大部分与 AI 相关的代码。还可以查看MILEPOST GCC或 H2020解码器项目,将机器学习技术应用于编译器。另见HIPEAC。
当然,您可以使用Haskell、Common Lisp(例如使用SBCL)或Ocaml编写 AI 软件。可以从中调用许多机器学习框架。数字运算库可以使用OpenCL。