【问题标题】:Python with Numpy/Scipy vs. Pure C++ for Big Data Analysis [closed]用于大数据分析的 Numpy/Scipy 与纯 C++ 的 Python [关闭]
【发布时间】:2014-09-22 20:00:32
【问题描述】:

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

我在阅读 Justin Peel 对线程“Is Python faster and lighter than C++?”的评论后发布了这个问题,他说: “此外,那些说 Python 在处理严重数字时速度很慢的人并没有使用过 Numpy 和 Scipy 模块。这些天,Python 在科学计算领域真正起飞。当然,速度来自使用用 C 编写的模块或编写的库在 Fortran 中,但在我看来,这就是脚本语言的美妙之处。”或者正如 S. Lott 在同一线程上关于 Python 所写的那样:“......因为它为我管理内存,所以我不必进行任何内存管理,从而节省了追踪核心泄漏的时间。” 我还在“Benchmarking (python vs. c++ using BLAS) and (numpy)”上检查了一个与 Python/Numpy/C++ 相关的性能问题,其中 J.F. Sebastian 写道“......我的机器上的 C++ 和 numpy 没有区别。”

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

注意:我对处理巨大的文本文件特别感兴趣。具有多列的 100K-800K 行的文本文件,Python 可能需要 5 分钟的时间来分析“仅”200K 行长的文件。

【问题讨论】:

  • 如果您真的关心这些文本文件的速度,那么值得对花费时间的地方进行基准测试 - 正如@HenryKeiter 建议的那样,可能主要用于磁盘访问,但如果文本处理正在添加重要的是,您可以通过巧妙地使用 python 内置函数(这将比 python 循环等快得多)和/或使用 Cython 处理文本(使用适当的 c_types - 那里有更多的学习曲线,但可能比C++)。

标签: python c++ numpy scipy benchmarking


【解决方案1】:

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

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

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 的循环可能会很快。在实践中,这并没有奏效。

【讨论】:

  • 我应该在我的问题中指定我对多维矩阵的兴趣不如对大型文本文件的兴趣。具有多列的 100K-800K 行的文本文件,Python 可能需要 5 分钟的时间来分析“仅”200K 行长的文件。
  • 使用 a = numexpr.evaluate('b + c +d')
  • @warship:创建自定义优化循环而不是将优化的构建块粘合在一起的论点更普遍适用。 如果您花时间使用 SIMD 手动矢量化(或编写可以自动矢量化的 C++),您可以获得极快的性能,尤其是在 L1D 或 L2 缓存中。如果标准构建块不能在一两步内完成工作,手动循环可能是 C++ 中的一大胜利。
【解决方案2】:

首先,如果您的大部分“工作”来自处理巨大的文本文件,这通常意味着您唯一有意义的速度瓶颈是磁盘 I/O 速度,而与编程语言无关。


至于核心问题,“回答”可能意见太丰富了,但我至少可以给你我自己的经验。多年来,我一直在编写 Python 来处理大数据(天气和环境数据)。我从来没有遇到过由于语言而导致的严重性能问题。

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

【讨论】:

  • 我知道天气和环境数据的规模是 TB,经常使像 Hadoop 这样的框架非常有用(其中固有语言是 Java(但也有 Python 和 C++ 流))。根据您使用 Python 处理此类大数据的多年经验,您是否曾发现有时使用 C++ 实现您的解决方案更有利于您的大数据目的(尽管在开发速度和成本方面效率较低)?跨度>
  • @XYZ927 我从来没有发现 Python 是一个有意义的瓶颈。正如您所指出的,有一些为此目的而优化的软件包,我个人从未遇到过这些软件包不足的情况。特别是考虑到这些过程往往是多么复杂,我认为 Python 的可读性和清晰性是一个巨大的好处。 可以在纯 C/C++/FORTRAN 中使它们更快吗?可能,但我个人认为开发工作不值得。无论如何,这些事情往往会在一夜之间完成——只要在早上完成,谁在乎它是在 4:30 还是 5:00 完成的?
  • 感谢您的反馈。我还想参考我发现的关于这个问题的另一篇文章,它表明 C++ 代码,如果不以某种方式编写,实际上可能比 Python 运行得慢:stackoverflow.com/questions/9371238/…
  • 哈哈,是的,这就是大型对冲基金纯粹使用 C++ 的原因。他们根本不知道 python 对大数据“好”
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2015-03-24
    • 2019-01-05
    • 2019-04-30
    • 2014-01-17
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多