为什么每个数据科学家都应该使用 C++ 编写代码

作者:微信公众号:【架构师老卢】
11-21 8:42
13

在Python占据主导地位的当下,宣扬C++在数据科学领域的优势似乎有些离经叛道。但请听我细细道来!尽管Python因其简单易用以及拥有丰富的库而常被誉为数据科学家的首选语言,但C++在性能和效率方面有着独一无二的优势。你可能会惊讶地发现,日常用于数据科学工作的诸多库在底层其实运行着C++代码。这是为什么呢?因为它速度超快呀!下面让我们来看看为什么C++依旧是数据科学领域的王者。

C++正在没落吗?

GitHub上排名前十的编程语言——图片摘自《2023年开源现状与人工智能的崛起(Octoverse)》 经常有人问我C++是否正在没落。嗯,如果真是那样,我大概就不会写关于C++的文章了。

根据GitHub的《Octoverse》报告,C++目前是该平台上第六大最受欢迎的编程语言。没错——尽管新兴语言备受关注,但C++依旧坚守阵地。数百万个代码仓库都在使用C++,从游戏引擎、嵌入式系统到高性能计算应用,无所不包。过去十年间,它一直保持着这一地位。不过我们得记住,在这前十的编程语言中,C++也是最难学的语言之一。

那么,为什么C++仍然如此盛行呢?答案就在于它在系统资源方面有着无与伦比的性能和掌控力,这在诸如数据科学这类对效率要求苛刻的领域至关重要。

热门数据科学库的幕后原理 还记得你调用PyTorch或TensorFlow来构建神经网络的时候吗?或者用Pandas操作数据、用NumPy进行数值计算的时候呢?

好吧,惊喜来了!实际上,幕后调用的都是C++代码。数据科学家们日常依赖的许多热门Python库在底层都使用了C++来实现高性能计算。

NumPy Python中用于科学计算的基础包NumPy,其快速的数组操作和数值计算在很大程度上依赖于C++(以及C语言)。当你对大型数组执行复杂的数学运算时,正是C++代码确保了一切能够平稳且高效地运行。

SciPy 基于NumPy构建的SciPy为科学和技术计算提供了更多功能,包括优化、线性代数、信号处理等等。它的许多核心例程都是用C++实现的,从而实现了高性能计算。

Pandas 作为用于数据操作和分析的强大库,Pandas在对性能要求苛刻的操作中使用了C++,尤其是在处理大型数据集时。当你进行数据合并、连接或重塑操作时,正是C++组件助力这些操作保持快速且内存高效。

TensorFlow 作为一款热门的机器学习库,TensorFlow的核心是用C++编写的,这使得它能够在GPU和CPU上进行高效计算。其Python API则充当了通往这个C++引擎的用户友好型接口。所以,当你在TensorFlow中构建和训练模型时,实际上是借助C++来承担繁重的计算任务。

PyTorch 类似地,PyTorch在其底层操作中使用了C++,从而实现了快速的张量计算以及GPU加速。位于PyTorch核心的*ATen库就是用C++编写的。

Scikit-learn 这个机器学习库为数据挖掘和分析提供了各种各样的算法和工具。出于性能方面的原因,它的许多底层算法都是用C++实现的。

甚至当你只是读取数据或进行数据增强时,C++通常也在幕后发挥作用以提高速度。学习C++不仅能让你更深入地理解这些框架的工作原理,还能赋予你为其做贡献的能力。想象一下,能够优化TensorFlow中的一个核心函数,或者给PyTorch添加一项新特性。通过掌握C++,你可以深入这些库的源代码,理解其中的复杂之处,甚至对它们加以改进。

对速度的需求 在数据科学领域考虑使用C++的首要原因之一就是性能。C++就好比编程语言中的跑车——速度快、功能强大,专为高性能而打造。在处理大型数据集或计算密集型算法时,执行时间就变得至关重要了。

C++允许你对代码进行优化以使其运行得更快,这对于以下情况至关重要:

  • 实时数据处理:像高频交易或实时分析这类应用需要极低的延迟。
  • 大规模模拟:诸如深度神经网络或物理模拟等复杂模型能极大地受益于C++的速度。
  • 资源受限的环境:在硬件资源有限的情况下,高效的代码能产生显著的差异。

虽然Python非常适合快速开发,但在对原始速度要求极高的情况下,它有时就力不从心了。而这时C++就像涡轮增压一样及时登场。

C++与其他编程语言对比

编程语言对比表格——作者供图

C++

  • 优势: C++具备卓越的性能,能对系统资源进行细粒度的控制,并且有着强大的并发支持。它能够直接与硬件交互并优化资源使用,这使其非常适合对性能要求苛刻的应用程序。
  • 劣势: 然而,C++的学习曲线较为陡峭。如果不小心处理,手动内存管理可能会导致错误,而且该语言的复杂性可能会让初学者望而却步。
  • 使用方: 像谷歌、脸书和微软这样的公司在其机器学习基础设施中广泛使用C++:
    • 谷歌:在TensorFlow的核心以及像搜索算法和YouTube推荐系统等对性能要求苛刻的服务中使用C++。
    • 脸书:在PyTorch的后端以及开发高性能机器学习系统时使用C++。
    • 微软:利用C++开发对性能要求较高的应用程序,包括Azure云平台的部分内容以及像小娜(Cortana)这样的人工智能服务。
  • 在数据科学方面的影响: C++适用于对性能要求苛刻的任务、与系统级代码集成以及资源优化至关重要的情况。诸如“我们如何以最小的延迟实时处理数据?”或者“我们如何在高吞吐量系统中优化资源使用?”这类问题,用C++来解决是最合适不过了。在机器学习领域,C++用于构建高效算法、优化神经网络性能以及处理大规模数据处理。

Python

  • 优势: Python以其易用性、丰富的库(如NumPy、Pandas、Scikit-learn)以及庞大的社区支持而闻名。它的语法简洁易读,对初学者来说容易上手,便于快速开发。
  • 劣势: Python较慢的执行速度以及对系统资源控制能力较弱,这在对性能要求较高的任务中可能会受到限制。如果不仔细管理,其动态类型也可能导致运行时错误。
  • 使用方: 像Instagram、Spotify和Netflix这样的公司在数据分析和生产服务中都使用Python:
    • Instagram:将Python与Django结合用于网络服务和数据分析任务。
    • Spotify:在后端服务、推荐算法以及生产环境中的机器学习模型中使用Python。
    • Netflix:利用Python进行数据分析、编写自动化脚本以及其流媒体服务的部分组件。
  • 在数据科学方面的影响: Python非常适合快速开发、探索性数据分析以及利用丰富的数据科学工具生态系统。它很适合诸如“我们如何快速构建一个机器学习模型的原型?”或者“我们如何对一个新数据集进行探索性数据分析?”这类任务。许多公司会将Python代码部署到生产环境中,尤其是在那些更看重开发速度和灵活性而非原始性能的服务中。

JavaScript

  • 优势: JavaScript在Web开发中无处不在,易于学习,并且具有适合交互式应用程序的事件驱动并发模型。
  • 劣势: 它的数据科学库有限,不太适合CPU密集型任务。其在繁重计算方面的性能比不上大多数编译型语言。
  • 使用方: 像谷歌文档、Slack和Asana这样的Web应用程序利用JavaScript来实现交互式用户界面和客户端功能。
  • 在数据科学方面的影响: JavaScript主要用于Web上的数据可视化(例如D3.js),适合诸如“我们如何为用户创建一个交互式数据仪表盘?”这类问题,但通常不用于繁重的数据处理或分析。

Java

  • 优势: Java性能强劲,并发支持能力强,在企业应用中广泛使用。其“一次编写,到处运行”的理念确保了跨平台兼容性。
  • 劣势: 其冗长的语法以及由于Java虚拟机(JVM)导致的较慢启动时间可能会阻碍快速开发。内存管理虽是自动的,但与手动控制相比效率可能较低。
  • 使用方: Java为像Apache Hadoop和Apache Spark这样的大数据框架提供支持。像Airbnb和领英这样的公司在后端服务中使用Java:
    • Airbnb:利用基于Java的框架来处理大规模数据处理和后端服务。
    • LinkedIn:使用Java构建其高性能后端系统,包括数据分析管道。
  • 在数据科学方面的影响: Java用于大数据框架中,适用于分布式计算任务。它可以解决诸如“我们如何在集群中处理PB级别的数据?”这类问题。虽然它在构建可扩展系统方面很强大,但相较于Python,在交互式数据分析方面使用得并不那么普遍。

Rust

  • 优势: Rust提供高性能以及安全特性,能够防止常见错误,比如空指针解引用和数据竞争。它着重于线程安全,有着强大的并发支持。
  • 劣势: 由于其所有权模型,Rust的学习曲线很陡峭,而且它相对较新,与更成熟的语言相比,其生态系统较小。
  • 使用方: 像Dropbox和Mozilla这样的公司在系统编程中使用Rust:
    • Dropbox:在对性能要求苛刻的组件中使用Rust,以确保安全性和并发性。
    • Mozilla:开发了Rust,并在像Firefox浏览器这样的项目中使用它来提升性能和安全性。
  • 在数据科学方面的影响: Rust在数据科学领域正受到越来越多的关注,因为它有可能在不牺牲安全性的情况下构建高性能应用程序。像Polars(一个数据框库)和用于生物信息学的Rust-Bio等库正在不断涌现。它适合诸如“我们如何在不牺牲安全性的情况下构建一个高性能系统?”这类任务。

C#

  • 优势: C#易于学习,有微软的强大支持,非常适合Windows平台以及使用Unity进行游戏开发。
  • 劣势: 从历史角度看,C#的跨平台支持较弱(尽管.NET Core已经改善了这一情况),而且相较于Python或R语言,它对数据科学的关注度较低。
  • 使用方: 用于Unity游戏引擎以及像埃森哲和Stack Overflow等公司的企业软件中。
  • 在数据科学方面的影响: C#有一些可用的数据科学库(例如ML.NET),但在数据科学领域使用得并不广泛。它适合将机器学习集成到.NET应用程序中,可解决诸如“我们如何将机器学习模型融入我们现有的企业软件中?”这类问题。

C语言

  • 优势: C语言提供高性能、低级系统访问以及极小的运行时开销。它高效且贴近硬件,非常适合系统编程。
  • 劣势: 手动内存管理以及缺乏面向对象特性会使开发变得更为复杂。与高级语言相比,其标准库较为有限。
  • 使用方: 像Linux这样的操作系统、嵌入式系统都使用C语言,它还是许多语言和库的基础。
  • 在数据科学方面的影响: 在需要极致性能但开发较为复杂的情况下会使用C语言。它通常作为高级语言中所用库的基础。最适合诸如“我们如何在资源受限的环境中实现最高效率?”这类问题。

细粒度控制 C++就像是给了你一把掌管王国——或者至少是掌管你系统资源的钥匙。

  • 内存管理:通过手动内存管理,你可以优化数据存储和访问模式,减少开销。像美国艺电(Electronic Arts)和维尔福(Valve)这样的公司在开发对资源管理要求苛刻的游戏时就使用C++。
  • 并发和多线程:C++对多线程和并行计算有着强大的支持,这对于在数据密集型任务中利用多核处理器至关重要。高性能计算中心以及像美国国家航空航天局(NASA)的模拟项目等都出于这个原因使用C++。

Python或许能让事情变得简单,但C++能让你打开引擎盖对其进行摆弄,给予你所需的掌控力以榨取最大性能。

为什么学习C++很重要 通过学习C++,你打开了一扇了解日常所用工具内部工作原理的大门。你将能够:

  • 深入源代码:探索并理解像TensorFlow、PyTorch、NumPy和Pandas等热门库背后的代码。
  • 为开源项目做贡献:为塑造数据科学领域的那些库做出有意义的贡献。
  • 优化你的项目:识别代码中的瓶颈并对其进行优化以提升性能。
  • 增强你的技能组合:凭借将高级数据科学专业知识与低级编程能力相结合的技能组合,在就业市场中脱颖而出。

想象一下,你既能开发一个机器学习模型,又能对其部署进行优化,使其运行速度翻倍。在如今这个数据驱动的世界里,这可是一项超能力呀!

Python在数据科学中的角色 现在,我们可不能把Python抛到一边不管。Python对于数据科学家来说仍然至关重要。它的简单性以及像NumPy、Pandas和Scikit-learn这样庞大的库生态系统,使其在数据操作、分析以及快速构建模型方面有着无可估量的价值。

公司会在生产环境中使用Python吗?当然会!许多公司都会将Python应用程序部署到生产环境中。例如:

  • Instagram:在其用于网络服务的生产代码中大量使用Python(搭配Django)。
  • Spotify:利用Python来实现后端服务、进行数据分析以及运行生产环境中的机器学习模型。
  • Netflix:使用Python脚本进行自动化、数据分析以及其内容分发网络的部分功能。

不过需要注意的是,虽然Python在快速开发和易用性方面表现出色,但公司通常会将它与像C++或Java这样的语言结合使用,用于对性能要求苛刻的组件。

理想的工作流程是怎样的呢?为了速度和便利,先用Python开发和构建模型的原型。一旦有了一个可行的模型,就可以使用C++对性能要求苛刻的部分进行优化。这种混合的方法能让你兼取二者之长:既利用Python的易用性,又发挥C++的高效性。

像pybind11这样的工具能让你无缝地将C++代码集成到Python项目中。你可以用C++编写对性能要求苛刻的函数,然后从Python脚本中调用它们,这样既能提高执行速度,又不会牺牲开发速度。

** 所以,情况就是这样。虽然在某些圈子里这可能是个不太受欢迎的观点,但C++提供了无与伦比的性能和掌控力,使其成为对效率和速度有要求的数据科学任务的绝佳选择。这并不是要取代Python,而是要根据工作选择合适的工具。

通过学习C++,你可以在数据科学领域开启新的可能性,尤其是对于那些性能是瓶颈的项目。先用Python快速开发,再用C++进行优化以实现扩展。

相关留言评论
昵称:
邮箱:
阅读排行