使用Numpy/Scipy的Python与纯C++进行大数据分析哪个更好
在做一些相对较小的项目时,我特别喜欢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 个回答
Python 确实能节省你的开发时间,它也给你提供了灵活性。如果只是拿两种语言来比较,Python的表现还是不错的。不过,它的能力和性能比C/C++要差一些,但在如今这个内存大、集群、缓存和并行处理技术发达的时代,这个差距真的不算什么。C++的另一个缺点是可能会崩溃,调试和修复大数据时可能会让人感到无比头疼。
不过,我想说的是,我还没见过一种编程语言能解决所有问题。没有一种编程语言能应对所有的挑战,除非你是那种喜欢用C语言来构建数据库的老手 :) 首先,你得搞清楚所有的问题、需求、数据类型,数据是结构化的还是非结构化的,你需要以什么样的方式和顺序处理哪些文本文件,调度是否是个问题等等……然后你需要用一些工具和脚本语言来构建一个完整的应用程序栈。你总是可以在硬件上投入更多的钱,或者买一些像Ab Initio这样昂贵的工具,它能帮助你加载和解析那些大文本文件,并对数据进行处理。除非你需要在非常大的数据文件上进行高端的模式匹配,否则Python结合其他工具就足够用了。但我认为没有一个简单的“是”或“否”的答案,在某些情况下,Python可能不是最佳选择。
简单来说,对于一些简单的问题,使用不同的编程语言其实差别不大。但如果你想处理复杂的事情,就会很快发现性能上的明显差异。
举个简单的例子,试着把三个向量加在一起:
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的循环也可能会很快。但实际上,这种情况并没有发生。