当前位置:  开发笔记 > 编程语言 > 正文

Python性能 - 您是否曾经不得不重写其他内容?

如何解决《Python性能-您是否曾经不得不重写其他内容?》经验,为你挑选了6个好方法。

有没有人用过Python的代码,结果表明它的执行速度不够快?

我的意思是,你被迫选择另一种语言因为它?

我们正在研究将Python用于几个较大的项目,我的感觉是,在大多数情况下,Python对于大多数场景(比如Java)来说足够快,因为它依赖于优化的C例程.

我想看看人们是否有他们从Python开始的实例,最终因为性能而不得不使用其他东西.

谢谢.



1> ConcernedOfT..:

是的,我有.我为二进制(长度前缀而不是分隔)bcp输出文件编写了一个行计数程序,最后不得不在C中重做它,因为python太慢了.这个程序非常小(在C中重新编写它只花了几天时间),所以我没有费心去尝试构建一个混合应用程序(用C编写的中心例程的python glue)但这也有是一条可行的路线.

具有性能关键位的较大应用程序可以用C和更高级语言的组合编写.您可以在C中编写性能关键部分,并为系统的其余部分提供Python接口. SWIG,Pyrex或Boost.Python(如果你使用的是C++)都提供了很好的机制来为你的Python接口进行管道工作.python的C API比Tcl或Lua的C API更复杂,但手动构建并不是不可行的.有关手工构建的Python/C API的示例,请查看cx_Oracle.

这种方法已被用于许多成功的应用程序,直到20世纪70年代(我知道). Mozilla基本上是用Javascript编写的,用C编写的核心引擎. 几个 CAD软件包,Interleaf(技术文档发布系统),当然还有EMACS,基本上用LISP编写,带有中央C语言,汇编语言或其他核心.相当多的商业和开源应用程序(例如Chandler或Sungard Front Arena)使用嵌入式Python解释器并在Python中实现应用程序的大部分内容.

编辑:在回复荷兰大师的评论时,在团队中为Python项目保留具有C或C++编程技能的人员,可以选择编写一些应用程序以提高速度.您可以期望获得显着性能提升的领域是应用程序在大型数据结构或大量数据上进行高度迭代的地方.在上面的行计数器的情况下,它必须吸入一系列总共几千兆字节的文件并经历一个过程,在该过程中它读取不同长度的前缀并用它来确定数据字段的长度.大多数字段都很短(只有几个字节长).这有点笨拙,非常低级和迭代,这使它很适合C.

许多python库(如numpy,cElementTree或cStringIO)都使用优化的C core和python API,以便于汇总数据.例如,numpy具有用C语言编写的矩阵数据结构和操作,它们完成所有艰苦工作,以及在聚合级别提供服务的Python API.


对于真正的性能关键项目,我更多地使用Python作为粘合剂而不是语言,更多地依赖于c/c ++模块来完成实际工作.特别是因为cPython有一个GIT,使得线程不太理想.

2> Triptych..:

这是一个比人们愿意承认的更难回答的问题.

例如,我可能会编写一个在Python中比在C中表现更好的程序.该语句的错误结论是"因此Python比C更快".实际上,这可能是因为我最近有Python及其最佳实践和标准库的经验.

事实上,没有人能够真正回答你的问题,除非他们确信他们可以用两种语言创建最佳解决方案,这是不太可能的.换句话说,"我的C解决方案比我的Python解决方案更快"与"C比Python更快"不一样

我愿意打赌,Guido Van Rossum可以为adam编写Python解决方案,并且Dustin的问题表现得非常好.

我的经验法则是,除非您正在编写需要计算时钟周期的应用程序,否则您可以在Python中实现可接受的性能.


我认为这个答案过于笼统.例如,我非常确定所有在C和Python中经验丰富的程序员都可以在C中编写比在Python中更快的DES实现.而且我愿意打赌,我可以在C中用比Guido van Rossum更快的DES实现.
这是一个很好的答案,因为它指出了基于语言本身进行性能比较是多么困难,没有更多细节.当然,我看到企业Java应用程序一直很慢,只是因为它们的设计很差.

3> sstock..:

加上我的0.02美元的记录.

我的工作涉及开发运行超过100千兆字节数据的数字模型.困难在于快速提出创收解决方案(即上市时间).为了在商业上取得成功,解决方案还必须快速执行(在最短的时间内计算解决方案).

对于我们来说,Python已被证明是开发解决方案的绝佳选择,原因如下所述:快速开发时间,语言表达能力,丰富的库等.但为了满足执行速度需求,我们采用了"混合"方法,即多个响应已经提到了.

    使用numpy计算密集的部分.我们使用numpy的代码更少,错误更少,开发时间更短,速度可以达到原生C++解决方案的1.1倍到2.5倍.

    Pickling(Python的对象序列化)中间结果可以最大限度地减少重新计算.我们系统的性质需要在相同的数据上执行多个步骤,因此我们"记住"结果并在可能的情况下重复使用它们.

    分析和选择更好的算法.在其他回复中已经说过了,但我会重复一遍:我们推出cProfile并试图用更好的算法替换热点.并非适用于所有情况.

    去C++.如果上面的失败,那么我们称之为C++库.我们使用PyBindGen编写Python/C++包装器.我们发现它远远优于SWIG,SIP和Boost.Python,因为它生成没有中间层的直接Python C API代码.

阅读这个列表,你可能会想到"重做了多少!我只是第一次在[C/C++/Java /汇编程序]中完成它并完成它."

让我把它放到透视中.使用Python,我们能够在5周内生成一个有效的创收应用程序,在其他语言中,以前需要3个月用于类似范围的项目.这包括优化我们发现的慢速Python部分所需的时间.



4> xan..:

在大学期间,我们正在编写一个计算机视觉系统,用于根据视频剪辑分析人类行为.我们使用python是因为它具有出色的PIL,可以加快开发速度,让我们可以轻松访问我们从视频中提取的图像帧,以便转换为数组等.

对于我们想要的90%,它很好,因为图像分辨率相当低,速度也不错.然而,一些过程需要一些复杂的逐像素计算以及众所周知的慢速卷积.对于这些特定区域,我们在C中重新编写了循环的最内层部分,并更新了旧的Python函数以调用C函数.

这给了我们两全其美.我们拥有python提供的数据访问的简易性,这使得能够快速开发,然后是C的直线速度,用于最密集的计算.



5> Kamil Kisiel..:

不太远.我在一家拥有分子模拟引擎和一系列用python编写的程序的公司工作,用于处理大型的千兆字节数据集.我们所有的分析软件现在都是用Python编写的,因为它具有开发灵活性和时间方面的巨大优势.

如果某些内容不够快,我们会使用cProfile对其进行分析并找到瓶颈.通常有一个或两个函数占用运行时的80%或90%.然后我们接受这些函数并用C语言重写它们,Python使用它的C API变得容易.在许多情况下,这导致一个数量级或更多的加速.问题消失了.然后我们继续以愉快的方式继续在Python中编写其他所有内容.冲洗并重复......

对于整个模块或类,我们倾向于使用Boost.python,它可能有点熊,但最终效果很好.如果它只是一个或两个函数,我们有时用scipy.weave内联它,如果项目已经使用scipy.



6> David Poole..:

每当我发现Python瓶颈时,我都会将C中的代码重写为Python模块.

例如,我有一些硬件将图像像素发送为4字节0RGB.在Python中将8M从0RGB转换为RGB需要太长时间,因此我将其重写为Python模块.

编写Python(或其他更高级别的语言)比用C编写要快得多,所以我使用Python直到我不能.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有