Python比C ++更快更轻吗?[关闭]


89

我一直认为Python的优势在于代码的可读性和开发速度,但是时间和内存使用却不如C ++。

这些统计数据让我非常震惊。

您的经验告诉您关于Python与C ++的时间和内存使用情况?


18
因此,在大多数情况下,Pyhton速度较慢,并且使用了更多的RAM,但是源更小。到底是什么问题?
nuriaion

2
我想我误解了结果。
亚历克斯

6
真正有趣的是,C ++测试仍然比C测试“更好”!
gbjbaanb 2009年

9
@gbjbaanb:不会令我惊讶。C ++添加了许多功能,可启用可能更快的代码。如果您知道自己在做什么,那么C ++会比C效率高得多。(当然,C ++还包含一些会影响性能的功能,但您不必使用它们)。但是人们普遍认为“ C比C ++更快”是错误的。(问题的
开头

1
链接已消失
阿恩

Answers:


235

我认为您错误地读取了这些统计信息。他们表明,Python 比C ++ 大约400倍,除了一个案例,Python更像是一种内存消耗。不过,就源代码大小而言,Python胜出。

我的Python经验显示出相同的趋势,即在进行任何严重的数字运算时,Python比C ++慢10到100倍。造成这种情况的原因很多,主要的原因是:a)Python被解释,而C ++被编译;b)Python没有原语,包括内建类型(int,float等)的所有对象都是对象;c)Python列表可以容纳不同类型的对象,因此每个条目都必须存储有关其类型的其他数据。这些都严重阻碍了运行时和内存消耗。

但是,这没有理由不理会Python。即使使用100慢速因子,许多软件也不需要大量时间或内存。开发成本是Python以简洁明了的风格取胜的地方。开发成本的这种提高通常超过了额外的CPU和内存资源的成本。但是,如果没有,则C ++胜出。


105
而且,那些说Python在进行严重数字运算时速度很慢的人还没有使用Numpy和Scipy模块。如今,Python确实在科学计算领域飞速发展。当然,速度来自使用C编写的模块或Fortran编写的库,但是我认为这就是脚本语言的美。
贾斯汀·皮

3
:我的Asure你说的这一个环节,以证明它blog.dhananjaynene.com/2008/07/...
ucefkh

2
关于:c)Python列表可以容纳不同类型的对象,因此每个条目都必须存储有关其类型的其他数据。python列表实际上是指向对象的指针的列表。在python中,值是知道其类型的,而变量只是“通用值对象”的指针(因此,偶数是不可变的)。因此,列表并不存储其内容的类型-只是指针。不过,您对内存的开销是正确的-python确实必须存储类型和其他上下文以存储任何类型的值。
亚历克斯

如果您谈论cpython..then是的,但是pypy在大多数情况下非常快(与Java相比,我想是Java的1/3速度),python的子集几乎与c ++一样快(请参阅shedskin)
Quonux

1
@JustinPeel我质疑那是真的。即使广泛使用numpyand scipy,庞大的python代码库也可能在纯python中包含大量代码,从而使事情慢于C++。当python脚本的代码C++所占的百分比达到时,它C会接近脚本的速度100,这时它不再是python脚本。当然,python正在起飞,但这并不是因为它像C++- 一样快,因为它更易于使用。
dbliss 2015年

132

枪战中所有最慢的Python使用(> 100x)都是需要高GFlop / s计数的科学操作。无论如何,您都不应该使用python。使用python的正确方法是导入一个执行这些计算的模块,然后与家人度过一个轻松的下午。是pythonic的方式:)


3
如今有几种Python到C ++的编译器,因此在某些情况下Python可以和C ++一样快。
安德森·格林

26

我的经验与基准相同。Python可能很慢并且使用更多的内存。我编写的代码少得多,并且第一次使用调试就少了。由于它为我管理内存,因此我无需进行任何内存管理,从而节省了追查核心泄漏的时间。

你有什么问题?


我对基准测试的结果感到困惑。原来我误解了它们。
亚历克斯

16

源大小实际上并不是衡量的明智之举。例如,以下shell脚本:

cat foobar

比其Python或C ++等效项短得多。


35
更长的Python或C ++版本也更容易维护。我认为源代码的大小确实很重要,对于某些简单的任务,简洁的shell脚本是不错的选择。
S.Lott

我也相信源代码的大小很重要,对于某些任务,Bash是完成任务的正确工具。在这里看到一个比较简单的bash脚本和python的漂亮示例:innolitics.com/articles/programming-languages/…(您需要向下滚动一点)。我认为这是一个比稍微复杂的例子cat footer
jdg

7

另外:Psyco与C ++的比较

这仍然是一个糟糕的比较,因为没有人会去做那些数字繁琐的东西基准测试,无论如何它们总是专注于纯Python。更好的方法是比较实际应用程序或C ++与NumPy的性能,以了解您的程序是否会明显变慢。


2
换句话说-由于数字紧缩的东西要慢得多,所以用C ++编写并从Python调用它:-)
igouy

1
如果您打算在python中使用库来加快速度,那么您最好在c ++中使用数字运算库。这样,您无需编写一堆代码即可保持c ++的灵活性:)
SuperSim135

那是神级无意义的死灵。OP从字面上指出,Python出于可读性和便利性的考虑而偏爱Python,为什么当有人通过让库作者为他照顾这些语言而获得大部分性能收益时,为什么有人直接使用他们不喜欢的语言呢?使用库的目的是不必自己做更好的工作,库恰好是本机绑定,这是优化/实现的细节。
millimoose

6

这里的问题是,您使用两种不同的语言来解决两个不同的问题...就像将C ++与汇编程序进行比较。

Python适用于快速的应用程序开发,并且只在最低限度考虑性能的情况下使用。

C ++ 不是用于快速的应用程序开发,从C继承了速度的遗产-用于低级编程。


3

与以往一样,托管语言和易于使用的编程语言也存在相同的问题-它们速度慢(有时会占用内存)。

这些是控制而不是处理的语言。如果我必须编写应用程序来转换图像并必须使用Python,那么所有处理都可以用C ++编写并通过绑定连接到Python,而接口和过程控制则完全是Python。


这些库已经为Python或C或Java编写,那么为什么不使用动态语言将它们粘合在一起呢?
aoeu256 '19

2

我认为这些统计数据表明Python速度较慢,并且为这些基准测试使用了更多的内存-您确定要以正确的方式读取它们吗?

以我的经验(主要是用Python编写与网络和文件系统绑定的程序),Python在任何重要方面都没有明显变慢。对于这种工作,其收益大于成本。


确实。当性能是一个问题,什么蟒是擅长的是结合在一起的高性能的外部模块,或原型系统,然后允许所述瓶颈(通常在一个内部循环深)被重写为C模块等等
XAN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.