为什么像 C、C++ 这样的语言不用于数据分析而不是 R、Python?

数据挖掘 预测建模 数据 C
2021-10-12 17:30:33

我已经开始使用 R 学习数据科学,但是本学期我将 C++ 作为课程,我的项目是使用 C++ 预测游戏的结果。我没有遇到过很多用 C++ 实现的实例(几乎没有,但我确实找到了像 Shark 这样的库)。

是否与 C++ 在处理大量数据时使用起来不那么简单有关?

4个回答

是的,你是对的——因为 C 和 C++ 更难使用,并且更多的样板代码会混淆你的模型构建逻辑。当您构建模型时,您必须快速且频繁地进行迭代,通常会丢弃大量代码。从长远来看,每次都必须编写样板代码会大大减慢您的速度。使用 R 的 caret 包或 Python 的 scikit-learn 库,我可以用 5-10 行代码训练一个模型。

生态系统也发挥着重要作用。例如,Ruby 易于使用,但社区从未真正看到对机器学习库的需求达到 Python 社区所拥有的程度。R 比 Python 更广泛地使用(仅用于统计和机器学习),因为它的生态系统的实力和满足这种需求的悠久历史。

值得指出的是,这些 R 和 Python 库中的大多数都是用 C 或 Fortran 等低级语言编写的,以提高速度。例如,我相信 Google 的 TensorFlow 是用 C 构建的,但为了让最终用户更轻松,它的 API 是用 Python 编写的。

任何现代解释语言相对于 C++ 的优势。 像任何权衡一样,这些在某些情况下是优势,在其他情况下是劣势。但是,您不希望这些便利的情况变得越来越少,因为硬件变得更快并且高级语言实现变得更加有效。没有编译步骤。在 my_program.py 中编写代码,然后使用 python my_program.py 运行它。没有内存管理。您不必为新变量显式分配内存,也不必显式释放已完成的内存。解释器将为您分配内存并在安全时释放它。高级本机数据类型。字符串、元组、列表、集合、字典、文件对象等都是内置的。例如,{"x": "y"} 定义了一个字典(哈希表),其中字符串“x”作为键,字符串“y”

Python 的特殊优势: 特别干净、直接的语法。这是 Python 语言的一个主要目标。熟悉 C 和 C++ 的程序员会发现语法熟悉但更简单,没有大括号和分号。鸭打字。如果一个对象支持 .quack,请继续调用 .quack 而不用担心该对象的特定类型。迭代器、生成器和推导。要获取文件中每一行的第一个字符,您可以编写:

file = open("file.txt") list_of_first_characters = [line[0] for line in file] file.close()

这仅对文件进行一次迭代。(这些特殊功能只是高级语言功能的简单内置语法的冰山一角。如果您感兴趣,请查看装饰器。)庞大的标准库。只是随机选择一些示例,Python 附带了几个 XML 解析器、csv 和 zip 文件读取器和写入器、用于使用几乎所有 Internet 协议和数据类型的库等。对构建 Web 应用程序的强大支持。与 Ruby 和 JavaScript 一起,Python 在 Web 开发社区中非常流行。有几个成熟的框架和支持社区可以帮助您入门。

这是因为您浪费了很多时间来配置和构建代码本身,而不是解决实际问题。示例...要加载数据,您必须在 C 中初始化内存,然后您需要稍后处理它。在 Python 中,您只需调用一个方法来加载它。垃圾收集器稍后会在您不需要时为您处理。这是一个非常简单的场景。

Python 和 R 以及这些“脚本语言”(在引号中,因为它们的用途远远超过它们的脚本起源)盛行,因为数据科学家通常具有编程和数学的混合背景。当然,如果以一种幼稚的方式完成,开销可能会很大,但是对于许多这些分析引擎和库来说,生态系统正在改善。

  • 许多分析库直接或间接使用 numpy,或者使用类似于 numpy 的一些技术,即将数据保存在高效的运行时表示中,并使用 Python 灵活的 API 直接对数据进行操作,而不是装箱的值。
  • Weld是一个旨在统一所有数据表示的项目,特别适用于跨框架数据传输(例如,将内存中的一个框架表示之间的数据复制到另一个框架)。
  • TensorFlow 实际上是用 C++ 编写的,但大多数人通过 Python API 与之交互。这会将内存中的图构造为应用程序描述,但是当您创建 a 时tf.Session,它会在其运行时实例化 C++ 对象以对应于图。因为每个操作都是粗粒度的(用户对每个输入重复说“给我结果”),大部分繁重的工作是由 C++ 中的运行时完成的。