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行的文件.
简短的回答是,对于简单的问题,那应该没有太大的区别.如果你想做任何复杂的事情,那么你很快就会遇到严峻的性能差异.
举个简单的例子,尝试将三个向量相加
a = b + c + d
Run Code Online (Sandbox Code Playgroud)
在蟒蛇,据我了解,这通常添加b
到c
,增加了结果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的循环可能很快.在实践中,这还没有成功.
归档时间: |
|
查看次数: |
14412 次 |
最近记录: |