在相对较小的项目上使用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分钟。
发布于 2014-07-31 12:25:37
发布于 2014-07-31 09:36:34
简单的答案是,对于简单的问题,应该没有太大的区别。如果你想做任何复杂的事情,那么你很快就会遇到明显的性能差异。
作为一个简单的示例,尝试将三个向量相加
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的循环可能会很快。在实践中,这并没有奏效。
发布于 2015-09-04 04:09:36
Python肯定会节省你的开发时间,如果你只是在这里比较两种语言,它也为你提供了灵活性,尽管它仍然无法与C/C++的功能和性能相匹敌,但在这个高内存、集群、缓存和并行处理技术的时代,谁会在乎呢?C++的另一个缺点是可能会崩溃,然后使用大数据进行调试和修复可能是一场噩梦。
但话虽如此,我还没有看到一个地方有一个适合所有解决方案的地方,没有一种编程语言包含每个问题的解决方案,(除非你是一个喜欢用C构建数据库的老C开发人员:)你必须首先确定所有的问题,要求,数据类型,无论它是结构化的还是非结构化的,你需要以什么方式和顺序操作什么样的文本文件,安排一个问题等等……然后,您需要使用一些工具集和脚本语言构建完整的应用程序堆栈。就像你总是可以在硬件上投入更多的钱,或者甚至购买一些昂贵的工具,比如capabilities,它给了你加载和解析那些大型文本文件并操纵数据的能力,除非你不需要真正的高端模式匹配功能来处理非常大的数据文件,python与其他工具的结合将是很好的。但是我没有看到一个是/否的答案,在某些情况下,python可能不是最好的解决方案。
https://stackoverflow.com/questions/25049338
复制相似问题