Python和C之间的性能差异

时间:2010-08-20 18:27:18

标签: python c performance

处理不同的项目我可以选择不同的编程语言,只要任务完成。

我想知道在Python中编写程序与在C中编写程序之间在性能方面的真正区别是什么。

要完成的任务非常多变,例如排序文本文件,磁盘访问,网络访问,文本文件解析。

例如,使用C与Python中的相同算法排序文本文件之间是否存在明显差异?

根据您的经验,考虑到当前CPU(i7)的强大功能,它是否真的有明显区别(考虑到它的程序不会让系统瘫痪)。

谢谢! :)

14 个答案:

答案 0 :(得分:36)

使用python直到遇到性能问题。如果你有一个弄清楚问题是什么(通常不是你预先猜到的)。然后解决可能是算法或数据结构变化的特定性能问题。在极少数情况下,您的问题确实需要C,那么您可以在C中编写该部分并从您的python代码中使用它。

答案 1 :(得分:11)

C几乎可以在任何性能类别中粉碎Python,但C编写和维护起来要困难得多,并且高性能并不总是值得花费时间和开发难度。

你说你正在做文本文件处理之类的事情,但你省略的是你正在做多少文本文件处理。如果你每小时处理1000万个文件,你可能会因用C语言编写而受益。但如果你每小时处理100个文件,为什么不使用python?你真的需要能够在10ms和50ms之间处理文本文件吗?如果您正在计划未来,请问自己,“这是否可以在以后投入更多硬件?”

在C中编写固体代码 hard 。确保你可以证明这项投资是合理的。

答案 2 :(得分:10)

一般来说,IO绑定工作将更多地依赖于算法然后取决于语言。在这种情况下,我会使用Python,因为它将具有第一类字符串和许多易于使用的库来操作文件等。

答案 3 :(得分:7)

  

例如,使用C与Python中的相同算法排序文本文件之间是否存在明显差异?

显着的差异是这些

  1. Python代码要少得多。

  2. Python代码更容易阅读。

  3. Python支持非常好的单元测试,因此Python代码的质量往往更高。

  4. 您可以更快地编写Python代码,因为语言特征较少。例如,没有预处理器可以真正节省大量的黑客攻击。超级经验的C程序员几乎没有注意到它。但所有#include三明治内容以及使.h文件正确无误是非常耗时的。

  5. Python可以更容易打包和部署,因为你不需要一个很棒的制作脚本来进行构建。

答案 4 :(得分:4)

如果您要排序和解析的文本文件很大,请使用C.如果不是,则无关紧要。你可以用任何语言编写糟糕的代码。我已经看到C中的简单代码用于计算比其他C代码慢10倍的三角形区域,因为内存管理不善,使用结构,指针等。

您的I / O算法应独立于您的计算算法。如果是这种情况,那么使用C作为计算算法会快得多。

答案 5 :(得分:3)

计算机性能问题的第一条规则:您的里程会有所不同。如果小的性能差异对您很重要,那么您将获得有效信息的 方式是使用您的配置,您的数据和<你的基准。这里的“小”就是两倍左右。

计算机性能问题的第二条规则:对于大多数应用程序而言,性能并不重要 - 编写应用程序的最简单方法即使在问题扩展时也能提供足够的性能。如果是这种情况(通常是这种情况),请不要担心性能。

那说:

  • C编译为机器可执行文件,因此至少可以像任何其他语言一样快地执行
  • Python通常被解释,因此可能需要比编译语言更多的CPU
  • 很少有应用程序是“CPU绑定的”。 I / O(到磁盘,显示器或内存)不受编译和解释注意事项的极大影响,并且经常是计算机在应用程序上花费的时间的主要部分
  • Python的工作抽象级别高于C,因此开发和调试时间可能会缩短

我的建议:使用您认为最容易使用的语言进行开发。让你的程序工作,然后检查是否有足够的性能。如果像往常一样,表现足够,那么你就完成了。如果没有,请对您的特定应用进行分析,以了解花费的时间超出预期或可接受的时间。看看是否以及如何修复应用程序的这一部分,并根据需要重复。

是的,有时您可能需要放弃工作并重新开始以获得所需的性能。但是有一个工作(虽然很慢)的应用程序版本将有助于取得进展。当你达到并征服这个表现目标时,你将在SO中回答表现问题而不是问他们。

答案 6 :(得分:3)

(假设 - 这个问题意味着作者熟悉C但不熟悉Python,因此我会以此为基础考虑答案。)

  

我想知道真实的是什么   不同之处在于   写作程序之间的表现   在Python中,与在C中完成相比。

除非实施得很差,否则C几乎肯定会更快,但真正的问题是:

  • 有什么发展意义 (开发时间,维护等) 对于任何一种实施?
  • 性能效益是否显着?

学习Python可能需要一些时间,但有些Python模块可以大大加快开发时间。例如,Python中的csv module使得读写csv变得容易。此外,Python字符串,数组,映射和其他对象使其比普通C更灵活,在我看来,它比同等的C ++更优雅。有些像网络访问这样的东西在Python中也可以更快地开发。

但是,学习如何对Python进行编程以完成任务可能需要一些时间。由于您关注性能,我建议尝试一个简单的任务,例如在C和Python中对文本文件进行排序。这将为您提供两种语言在性能,开发时间和可能维护方面的更好基线。

答案 7 :(得分:1)

这实际上很大程度上取决于你在做什么,以及有问题的算法是否可以通过本地编译的库在Python中获得。如果是,那么我相信你会看到足够接近Python的性能数字,而Python很可能是你的答案 - 假设它是你的首选语言。如果您必须自己实现算法,根据所需的逻辑数量和数据集的大小,C / C ++可能是更好的选择。没有更多信息,很难提供不那么模糊的答案。

答案 8 :(得分:1)

要了解速度的原始差异,请查看Computer Languages Benchmark Game

然后你必须决定这种差异对你是否重要。

就个人而言,我最终决定它确实如此,但大部分时间而不是使用C,我最终使用其他更高级别的语言。我个人主要使用Scala,但Haskell和C#以及Java都有自己的优势。

答案 9 :(得分:0)

在所有程序中,无法确定Python或C中的平均速度是更快还是更慢。

对于我用两种语言实现的程序,使用类似的算法,在C语言中重新实现python代码时,我发现字符串和IO重代码没有任何改进(有时性能下降)。执行时间由字符串的分配和操作(python非常有效地实现)和等待IO操作(在任何一种语言中都会产生相同的开销)来控制,因此python的额外开销几乎没有差别。

但是对于对图像文件执行简单操作的程序,比如说(图像足够大,处理时间比IO更明显),C非常快。对于这类任务,运行python代码的大部分时间都花在了Python Stuff上,这使得在底层操作上花费的时间相形见绌(乘法,加法,比较等)。当重新实现为C时,官僚机构消失了,计算机花费时间做真正诚实的工作,因此事情运行得更快。

py代码在(例如)5秒内运行并且C代码在(比如)0.05中运行并不罕见。这是一个100倍的增长 - 但从绝对意义上讲,这并不是一件大事。编写python代码要比编写C代码花费的时间长得多,你的程序必须运行很多次才能获得时间利润。由于各种原因,我经常在C中重新实现,但如果你没有这个要求那么它可能不值得打扰。你将无法恢复生活中的这一部分,明年电脑会更快。

答案 10 :(得分:0)

实际上你可以使用python有效地解决你的大部分任务。

您应该知道要使用哪些工具。对于文本处理,来自Egenix家伙的精彩包装 - http://www.egenix.com/products/python/mxBase/mxTextTools/。我能够在python中创建非常有效的解析器,因为所有繁重的工作都是由本机代码完成的。

同样的方法适用于任何其他问题 - 如果您遇到性能问题,请使用Python接口获得一个C / C ++库,它可以有效地实现任何瓶颈。

答案 11 :(得分:0)

C肯定比Python快,因为Python是用C语言编写的。 C是中级语言,因此速度更快,但C&amp; C之间差别不大。关于可执行时间的Python。 但是用Python编写代码真的很容易,而且编写代码和学习Python的时间要比C短得多。 因为它易于编写也易于测试。

答案 12 :(得分:-1)

你会发现C慢得多。您的开发人员必须跟踪内存分配,并使用库(如glib)来处理python内置的字典或列表等简单事物。

此外,当发生错误时,您的C程序通常会崩溃,这意味着您需要在调试器中发生错误。 Python会给你一个堆栈跟踪(通常)。

您的代码会更大,这意味着它会包含更多错误。因此,不仅需要更长的时间来编写,调试还需要更长的时间,并且会出现更多的错误。这意味着客户会更频繁地注意到这些错误。

因此,您的开发人员将花费更长时间来修复旧错误,因此新功能将更慢地完成。

与此同时,您的竞争对手将使用合理的编程语言,他们的产品功能和可用性将会越来越快,您的产品会很快看起来很糟糕。您的客户将离开,您将破产。

答案 13 :(得分:-1)

与Python相比,用C编写代码的时间过长会比C和Python执行速度之间的差异大得多。