为什么Python平均比C / C ++慢?我学习了Python作为我的第一门编程语言,但我只是从C开始,我觉得我已经看到了明显的差异。
答案 0 :(得分:65)
Python是一种比C语言更高级的语言,这意味着它从你的内容管理,指针等中抽象出计算机的细节,并允许你以更接近人类思考的方式编写程序。 p>
如果只测量执行时间,C代码通常比Python代码快10到100倍。但是,如果您还包括开发时间,Python通常会胜过C.对于许多项目,开发时间远比运行时性能更重要。更长的开发时间可直接转化为额外成本,更少的功能和更慢的上市时间。
内部Python代码执行速度较慢的原因是因为代码在运行时被解释而不是在编译时被编译为本机代码。
其他解释语言(如Java字节码和.NET字节码)运行速度比Python快,因为标准发行版包含JIT compiler,它在运行时将字节码编译为本机代码。 CPython之所以没有JIT编译器的原因是因为Python的动态特性使得编写它变得困难。 work中有progress来编写更快的Python运行时,因此您希望将来可以减少性能差距,但在标准Python发行版包含强大的JIT编译器之前可能需要一段时间。
答案 1 :(得分:39)
CPython特别慢,因为它没有Just in Time优化器(因为它是参考实现,在某些情况下选择简单性而不是性能)。 Unladen Swallow是一个将LLVM支持的JIT添加到CPython中的项目,并实现了大规模的加速。 Jython和IronPython可能比CPython快得多,并且它们得到了大量优化的虚拟机(JVM和.NET CLR)的支持。
然而,有一点可以让Python变慢,它是动态类型的,并且每次属性访问都有大量的查找。
例如,在对象f
上调用A
会导致__dict__
中的可能查找,__getattr__
的调用等,然后最终调用__call__
可调用对象f
。
关于动态类型,如果您知道要处理的数据类型,可以进行许多优化。例如,在Java或C中,如果您想要求和的整数数组,那么最终的汇编代码就像在索引i
处获取值一样简单,将其添加到accumulator
,然后递增i
。
在Python中,很难使代码达到最佳状态。假设您有一个包含int
的列表子类对象。在添加任何内容之前,Python必须调用list.__getitem__(i)
,然后通过调用accumulator.__add__(n)
将其添加到“累加器”,然后重复。这里可能会发生大量的替代查找,因为另一个线程可能已经改变了例如__getitem__
方法,列表实例的dict或类的dict,在调用add或getitem之间。即使在本地命名空间中找到累加器和列表(以及您正在使用的任何变量)也会导致dict查找。当使用任何用户定义的对象时,同样的开销也适用,尽管对于某些内置类型,它有所缓解。
值得注意的是,bigint(Python 3中的int,Python 2.x中的long),list,set,dict等原始类型是人们在Python中使用的很多东西。这些对象上有大量内置操作已经足够优化。例如,对于上面的示例,您只需调用sum(list)
而不是使用累加器和索引。坚持这些,以及使用int / float / complex进行一些数字运算,你通常不会遇到速度问题,如果你这样做,可能会有一个小的时间关键单元(例如SHA2摘要函数),你可以简单地转到C(或Java代码,在Jython中)。事实上,当您编写C或C ++代码时,您将浪费很多的时间来完成您可以在几秒钟/几行Python代码中执行的操作。我会说这种权衡总是值得的,除非您正在做类似嵌入式或实时编程的事情并且负担不起。
答案 2 :(得分:11)
编译与解释在这里并不重要:Python 是编译的,并且它只是任何非平凡程序的运行时成本的一小部分。
主要成本是:缺少对应于本机整数的整数类型(使所有整数运算更加昂贵),缺少静态类型(这使得方法的解析更加困难,并且意味着值的类型必须在运行时检查),并且缺少未装箱的值(这会减少内存使用量,并且可以避免间接级别)。
并不是说这些东西中的任何一个都不可能或者不能在Python中更高效,但是选择的目的是为了方便程序员的方便性和灵活性,以及语言清洁度超过运行时速度。聪明的JIT编译可以克服其中一些成本,但Python提供的好处总是需要付出一些代价。
答案 3 :(得分:9)
python和C之间的区别在于解释(字节码)和编译(到本机)语言之间的通常差异。就个人而言,我并不认为python很慢,它管理得很好。如果你试图在它的领域之外使用它,当然,它会更慢。但是为此,你可以为python编写C扩展,它将时间关键算法放在本机代码中,使其更快。
答案 4 :(得分:4)
Python通常作为脚本语言实现。这意味着它通过一个解释器,这意味着它可以动态地将代码转换为机器语言,而不是从头开始将所有可执行文件都用于机器语言。因此,除了执行代码之外,还必须支付翻译代码的成本。即使CPython也是如此,即使它编译为更接近机器语言的字节码,因此可以更快地翻译。使用Python还有一些非常有用的运行时功能,如动态类型,但是这些东西通常无法在最高效的实现上实现,而且运行成本不会很高。
如果你正在进行像编写着色器这样的处理器密集型工作,那么Python比C ++慢大约200倍的情况并不少见。如果你使用CPython,那个时间可以减少一半,但它仍然没有那么快。随着所有这些runtmie好吃的价格。有很多基准可以证明这一点,here's是一个特别好的基准。正如首页所承认的那样,基准是有缺陷的。它们都是由用户尽力使用他们选择的语言编写高效代码提交的,但它为您提供了一个很好的总体思路。
如果您担心效率,我建议您尝试将两者混合在一起:那么您可以充分利用这两个方面。我主要是一名C ++程序员,但我认为很多人倾向于在C ++中编写过多的普通高级代码,而这只是一件令人讨厌的事情(编译时只是一个例子)。将脚本语言与更接近金属的高效语言(如C / C ++)相结合,实际上是将程序员效率(生产力)与处理效率进行平衡的方法。
答案 5 :(得分:3)
除了已发布的答案之外,有一点是pythons能够在运行时更改您无法更改的内容,例如C.您可以随时向成员函数添加成员函数。 此外,蟒蛇动态性质使得无法说出将哪种类型的参数传递给函数,这反过来又会使整数优化更加困难。
RPython似乎是一种解决优化问题的方法。
但是,对于数字训练等来说,它可能不会接近C的表现。
答案 6 :(得分:3)
将C / C ++与Python进行比较并不是一个公平的比较。比如将F1赛车与实用卡车进行比较。
令人惊讶的是,与其他动态语言的同行相比,Python的速度有多快。虽然这种方法通常被认为是有缺陷的,但请查看The Computer Language Benchmark Game以查看类似算法的相对语言速度。
与Perl,Ruby和C#的比较更“公平”
答案 7 :(得分:1)
C和C ++编译为本机代码 - 也就是说,它们直接在CPU上运行。 Python是一种解释型语言,这意味着您编写的Python代码必须经过许多很多抽象阶段才能成为可执行的机器代码。
答案 8 :(得分:0)
Python 是一种高级编程语言。以下是 Python 脚本的运行方式:
python源码首先编译成Byte Code。是的,你明白我的意思了!虽然 Python 是一种解释型语言,但它首先被编译成字节码。该字节码然后由 Python Virtual Machine(PVM) 解释和执行。
这种编译和执行使 Python 比其他低级语言(如 C/C++)慢。在C/C++等语言中,源代码被编译成binary code,可以直接由CPU执行,因此其执行效率比Python高。
答案 9 :(得分:-5)
python是不符合解释语言的语言,未与CPU硬件结合使用
但是我有一个将python增加为一种更快的编程语言的解决方案
1.Use python3 for run and code python command like Ubuntu or any Linux distro use python3 main.py and update regularly your python so you python3 framework modules and libraries i will suggest use pip 3.
2.Use [Numba][1] python framework with JIT compiler this framework use for data visualization but you can use for any program this framework use GPU acceleration of your program.
3.Use [Profiler optimizing][1] so this use for see with function or syntax for bit longer or faster also have use full to change syntax as a faster for python its very god and work full so this give a with function or syntax using much more time execution of code.
4.Use multi threading so making multiprocessing of program for python so use CPU cores and threads so this make your code much more faster.
5.Using C,C#,C++ increasing python much more faster i think its called parallel programing use like a [cpython][1] .
6.Debug your code for test your code to make not bug in your code so then you will get little bit your code faster also have one more thing Application logging is for debugging code.
and them some low things that makes your code faster:
1.Know the basic data structures for using good syntax use make best code.
2.make a best code have Reduce memory footprinting.
3.Use builtin functions and libraries.
4.Move calculations outside the loop.
5.keep your code base small.
因此使用此工具可以更快地获取代码,是的,因此使用此python并不是一种慢速的编程语言