首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python结合Numpy/Scipy与纯C++进行大数据分析

Python结合Numpy/Scipy与纯C++进行大数据分析
EN

Stack Overflow用户
提问于 2014-07-31 08:58:14
回答 3查看 16.1K关注 0票数 12

在相对较小的项目上使用Python让我欣赏到了这种语言的动态类型本质(不需要声明代码来跟踪类型),这通常会使开发过程更快、更轻松。然而,我觉得在更大的项目中,这实际上可能是一个障碍,因为代码的运行速度会比C++中的等价物慢。但话又说回来,在C++中使用Numpy和/或Scipy可能会让您的代码运行得与原生C++程序一样快(在Python中,开发Numpy和/或Scipy的代码有时需要更长的时间)。

读了贾斯汀·皮尔在帖子"Is Python faster and lighter than C++?“上的评论后,我提出了这个问题。他在帖子中写道:”另外,那些说Python在认真处理数字时速度很慢的人还没有用过Numpy和Scipy模块。Python最近在科学计算领域真的很有起色。当然,它的速度来自于使用C编写的模块或用Fortran编写的库,但在我看来,这就是脚本语言的美妙之处。“或者就像S.Lott在同一条关于Python的线程上写的那样:"...Since它为我管理内存,我不需要做任何内存管理,节省了追查内核泄漏的时间。“我还在"Benchmarking (python vs. c++ using BLAS) and (numpy)“上检查了一个与Python/ numpy /C++相关的性能问题,J.F.Sebastian写道:”在我的机器上,...There在C++和numpy之间没有区别。“

这两个线程都让我怀疑,对于一个使用Numpy/Scipy来生产软件来分析‘大数据’的Python程序员来说,了解C++是否有什么真正的优势,而大数据的性能显然非常重要(但代码的可读性和开发速度也是必须的)?

注意:我对处理大型文本文件特别感兴趣。具有多列的100K-800K行的文本文件,而Python分析一个“只有”200K行的文件可能需要5分钟。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-31 12:25:37

首先,如果您的大部分“工作”来自于处理大型文本文件,这通常意味着您唯一有意义的速度瓶颈是磁盘I/O速度,而不管使用哪种编程语言。

至于核心问题,它可能有太多的观点来“回答”,但我至少可以给你我自己的经验。多年来,我一直在编写Python来进行大数据处理(天气和环境数据)。由于语言的原因,我从来没有遇到过严重的性能问题。

开发人员(包括我自己)倾向于忘记的一件事是,一旦进程运行得足够快,花费时间使其运行得更快是对公司资源的浪费。Python (使用像pandas/scipy这样的成熟工具)的运行速度足以满足需求,而且开发速度也很快,所以在我看来,对于“大数据”处理来说,它是一种完全可以接受的语言。

票数 11
EN

Stack Overflow用户

发布于 2014-07-31 09:36:34

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

作为一个简单的示例,尝试将三个向量相加

代码语言:javascript
复制
a = b + c + d

据我所知,在python中,这通常会将b添加到c中,将结果添加到d中,然后指向最终结果。这些操作中的每一个都可以很快,因为它们只是被扩展到BLAS库中。但是,如果向量很大,则中间结果不能存储在缓存中。将中间结果移动到主存的速度很慢。

你可以在C++中使用valarray来做同样的事情,它将会相当的慢。然而,你也可以做一些其他的事情

代码语言:javascript
复制
for(int i=0; i<N; ++i)
  a[i] = b[i] + c[i] + d[i]

这消除了中间结果,并使代码对主存的速度不那么敏感。

在python中做同样的事情是可能的,但是python的循环构造效率不高。它们会做一些很好的事情,比如边界检查,但有时在不使用安全设置的情况下运行起来会更快。例如,Java做了相当多的工作来删除边界检查。因此,如果您有一个足够智能的编译器/JIT,python的循环可能会很快。在实践中,这并没有奏效。

票数 5
EN

Stack Overflow用户

发布于 2015-09-04 04:09:36

Python肯定会节省你的开发时间,如果你只是在这里比较两种语言,它也为你提供了灵活性,尽管它仍然无法与C/C++的功能和性能相匹敌,但在这个高内存、集群、缓存和并行处理技术的时代,谁会在乎呢?C++的另一个缺点是可能会崩溃,然后使用大数据进行调试和修复可能是一场噩梦。

但话虽如此,我还没有看到一个地方有一个适合所有解决方案的地方,没有一种编程语言包含每个问题的解决方案,(除非你是一个喜欢用C构建数据库的老C开发人员:)你必须首先确定所有的问题,要求,数据类型,无论它是结构化的还是非结构化的,你需要以什么方式和顺序操作什么样的文本文件,安排一个问题等等……然后,您需要使用一些工具集和脚本语言构建完整的应用程序堆栈。就像你总是可以在硬件上投入更多的钱,或者甚至购买一些昂贵的工具,比如capabilities,它给了你加载和解析那些大型文本文件并操纵数据的能力,除非你不需要真正的高端模式匹配功能来处理非常大的数据文件,python与其他工具的结合将是很好的。但是我没有看到一个是/否的答案,在某些情况下,python可能不是最好的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25049338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档