Python与Numpy/Scipy与Pure C++进行大数据分析

war*_*hip 12 c++ python benchmarking numpy scipy

在相对小的项目做的Python让我欣赏这种语言的动态类型性质(无需申报代码跟踪的类型),这往往使沿途更快,痛苦少的发展过程.但是,我觉得在更大的项目中,这实际上可能是一个障碍,因为代码运行速度比在C++中等效.但话又说回来,使用numpy的和/或SciPy的使用Python可以让你的代码作为一个本地C++程序(其中在C++代码有时会需要更长的时间来开发)一样跑得快.

我在阅读Justin Peel对线程" Python是否比C++更快,更轻? " 的评论后发布了这个问题,他说:"而且,那些谈论Python对于严重数字运算缓慢的人并没有使用Numpy和Scipy模块. Python是真正起飞在科学计算的这些日子.当然,速度来自使用用C或Fortran语言编写的库模块,但是这在我看来,一个脚本语言的美." 或者,正如·洛写关于Python的在同一线程上:"......既然管理内存对我来说,我没有做任何的内存管理,节约追逐核泄漏的时间." 我还考察了一个Python/numpy的/ C++相关的性能问题的" 标杆(蟒蛇与C++使用BLAS)和(numpy的) ",其中JF塞巴斯蒂安写道:"......这里是C之间和numpy的我的机器上没有区别++".

这两个线程让我想知道,对于使用Numpy/Scipy生成软件来分析"大数据"的Python程序员来说,知道C++是否有任何真正的优势,其中性能显然非常重要(还有代码可读性和开发)速度是必须的)?

注意:我对处理大量文本文件特别感兴趣.具有多列的100K-800K行的文本文件,其中Python可能需要花费五分钟来分析"仅"200K行的文件.

Hen*_*ter 11

首先,如果你的"工作"的大部分来自处理大量文本文件,这通常意味着你唯一有意义的速度瓶颈是你的磁盘I/O速度,无论编程语言如何.


至于核心问题,"回答"可能过于富有意见,但我至少可以给你自己的经验.多年来,我一直在编写Python来处理大数据处理(天气和环境数据).由于语言原因,我从未遇到过重大的性能问题.

开发人员(包括我自己)倾向于忘记的事情是,一旦流程运行得足够快,花费时间使其运行得更快就浪费公司资源.Python(使用类似pandas/的成熟工具scipy)运行速度足以满足要求,并且开发速度快,所以对于我的钱来说,它是"大数据"处理的完全可接受的语言.


Dam*_*eel 5

简短的回答是,对于简单的问题,那应该没有太大的区别.如果你想做任何复杂的事情,那么你很快就会遇到严峻的性能差异.

举个简单的例子,尝试将三个向量相加

a = b + c + d
Run Code Online (Sandbox Code Playgroud)

在蟒蛇,据我了解,这通常添加bc,增加了结果d,然后再做出点是最后的结果.这些操作中的每一个都可以很快,因为它们只是用于BLAS库.但是,如果向量很大,则中间结果不能存储在高速缓存中.将该中间结果移动到主存储器是很慢的.

您可以使用valarray在C++中执行相同的操作,它将同样缓慢.但是,您也可以做其他事情

for(int i=0; i<N; ++i)
  a[i] = b[i] + c[i] + d[i]
Run Code Online (Sandbox Code Playgroud)

这消除了中间结果并使代码对主存储器的速度不太敏感.

在python中做同样的事情是可能的,但是python的循环结构效率不高.他们做了很好的事情,比如边界检查,但有时候在安全脱离的情况下运行会更快.例如,Java在删除边界检查方面做了大量工作.所以如果你有一个足够聪明的编译器/ JIT,python的循环可能很快.在实践中,这还没有成功.

  • 使用a = numexpr.evaluate('b + c + d') (3认同)