使用Numpy/Scipy的Python与纯C++进行大数据分析哪个更好

12 投票
3 回答
16885 浏览
提问于 2025-04-18 15:26

在做一些相对较小的项目时,我特别喜欢Python这种动态类型的特性(不需要写很多代码来声明变量类型),这让开发过程变得更快、更轻松。不过,我觉得在更大的项目中,这可能会成为一个障碍,因为Python的代码运行速度可能比C++慢。不过,使用Numpy和/或Scipy库的话,Python的代码运行速度可以和C++的原生程序一样快(而且C++的代码有时候开发起来会更耗时间)。

我在阅读Justin Peel在“Python比C++快且轻量吗?”这个讨论中的评论后,才想到这个问题。他提到:“还有,那些说Python在处理复杂计算时很慢的人,其实没有使用过Numpy和Scipy模块。如今,Python在科学计算领域发展得非常快。当然,速度的提升来自于使用用C语言写的模块或用Fortran写的库,但我认为这就是脚本语言的魅力。”另外,S. Lott在同一个讨论中提到:“……因为它帮我管理内存,所以我不需要自己去处理内存问题,这样就省下了很多时间去追踪内存泄漏。”我还查看了一个关于Python/Numpy/C++性能比较的问题,链接是“基准测试(Python vs. C++ 使用BLAS和Numpy)”,在那儿J.F. Sebastian写道:“……在我的机器上,C++和Numpy之间没有区别。”

这两个讨论让我开始思考,对于一个使用Numpy/Scipy进行“大数据”分析的Python程序员来说,掌握C++是否真的有任何实际的好处,因为在这种情况下,性能显然非常重要(而且代码的可读性和开发速度也是必须考虑的)。

注意:我特别感兴趣的是处理超大的文本文件。这些文本文件的行数在10万到80万之间,有多个列,而Python分析一个“仅有”20万行的文件可能需要花费五分钟的时间。

3 个回答

1

Python 确实能节省你的开发时间,它也给你提供了灵活性。如果只是拿两种语言来比较,Python的表现还是不错的。不过,它的能力和性能比C/C++要差一些,但在如今这个内存大、集群、缓存和并行处理技术发达的时代,这个差距真的不算什么。C++的另一个缺点是可能会崩溃,调试和修复大数据时可能会让人感到无比头疼。

不过,我想说的是,我还没见过一种编程语言能解决所有问题。没有一种编程语言能应对所有的挑战,除非你是那种喜欢用C语言来构建数据库的老手 :) 首先,你得搞清楚所有的问题、需求、数据类型,数据是结构化的还是非结构化的,你需要以什么样的方式和顺序处理哪些文本文件,调度是否是个问题等等……然后你需要用一些工具和脚本语言来构建一个完整的应用程序栈。你总是可以在硬件上投入更多的钱,或者买一些像Ab Initio这样昂贵的工具,它能帮助你加载和解析那些大文本文件,并对数据进行处理。除非你需要在非常大的数据文件上进行高端的模式匹配,否则Python结合其他工具就足够用了。但我认为没有一个简单的“是”或“否”的答案,在某些情况下,Python可能不是最佳选择。

5

简单来说,对于一些简单的问题,使用不同的编程语言其实差别不大。但如果你想处理复杂的事情,就会很快发现性能上的明显差异。

举个简单的例子,试着把三个向量加在一起:

a = b + c + d

在Python中,按照我的理解,这个过程通常是先把b加到c上,然后把结果再加到d上,最后得到一个最终结果。每一步操作都可以很快,因为这些计算会交给一个叫BLAS的库来处理。不过,如果向量很大,中间的结果可能无法存放在缓存里,这样就得把它移到主内存中,而这个过程会比较慢。

在C++中,你也可以用valarray来做同样的事情,速度也会差不多。但是,你还可以做一些其他的事情:

for(int i=0; i<N; ++i)
  a[i] = b[i] + c[i] + d[i]

这样就避免了中间结果的产生,让代码在访问主内存时不那么敏感。

在Python中做类似的事情也是可以的,但Python的循环结构效率没有那么高。它会进行一些边界检查,这样虽然安全,但有时候不检查反而会更快。比如Java就会做很多工作来去掉这些边界检查。所以如果你有一个足够聪明的编译器或者即时编译器(JIT),Python的循环也可能会很快。但实际上,这种情况并没有发生。

11

首先,如果你的“大部分工作”都是在处理超大的文本文件,那通常意味着你最大的速度瓶颈就是硬盘读写速度,这和你用什么编程语言关系不大。


关于核心问题,可能太主观了,没法给出一个明确的“答案”,但我可以分享一下我的经验。我已经用Python做了好几年的大数据处理(比如天气和环境数据)。我从来没有因为语言的问题遇到过明显的性能问题。

开发者(包括我自己)常常会忘记,一旦程序运行得“足够快”,再花时间让它更快其实是在浪费公司的资源。Python(使用像pandasscipy这样的成熟工具)运行得足够快,能够满足需求,而且开发起来也很迅速,所以在我看来,它是处理“大数据”的一个完全可以接受的语言。

撰写回答