为什么Python平均看来比C / C ++慢?我学习Python是我的第一门编程语言,但是我只是从C入手,已经感觉到明显的不同。
为什么Python平均看来比C / C ++慢?我学习Python是我的第一门编程语言,但是我只是从C入手,已经感觉到明显的不同。
Answers:
Python是比C更高级的语言,这意味着它从您那里抽象出计算机的详细信息-内存管理,指针等,并允许您以更接近人类思维的方式编写程序。
的确,如果仅衡量执行时间,C代码的运行速度通常比Python代码快10至100倍。但是,如果还包括开发时间,Python通常会胜过C。对于许多项目,开发时间比运行时性能更为重要。较长的开发时间直接转化为额外的成本,较少的功能和较慢的上市时间。
在内部,Python代码执行速度较慢的原因是因为代码是在运行时解释的,而不是在编译时编译为本机代码。
其他解释语言(例如Java字节码和.NET字节码)的运行速度比Python快,因为标准发行版包括JIT编译器,可在运行时将字节码编译为本地代码。CPython还没有JIT编译器的原因是因为Python的动态特性使其难以编写。有工作的进展情况写一个更快的Python运行,所以你应该期望的性能差距在今后可以减少,但它可能会需要一段时间Python标准版包括一个强大的JIT编译器前。
CPython特别慢,因为它没有即时优化器(因为它是参考实现,在某些情况下会选择简单性而不是性能)。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__
在调用add或getitem之间,方法,列表实例的dict或类的dict。即使在本地名称空间中找到累加器和列表(以及您正在使用的任何变量),也会导致dict查找。使用任何用户定义的对象时,也会产生相同的开销,尽管对于某些内置类型,它有所减轻。
还值得注意的是,原始类型(如bigint(Python 3中为int,Python 2.x中为long),列表,集合,字典等)是人们在Python中使用很多的原始类型。这些对象上有许多内置操作,它们已经充分优化。例如,对于上面的示例,您只需调用即可,sum(list)
而不使用累加器和索引。坚持这些,并使用int / float / complex进行一些数字运算,通常不会出现速度问题,如果这样做,可能会有一个时间紧迫的小单元(例如SHA2摘要功能)可以只需移至C(或Jython中的Java代码)即可。事实是,当您编码C或C ++时,您将浪费很多时间时间来完成您可以在几秒钟/几行Python代码中完成的工作。我要说的是,权衡总是值得的,除非您正在做诸如嵌入式或实时编程之类的事情而负担不起。
编译与解释在这里并不重要:Python是经过编译的,对于任何不重要的程序,这仅占运行时成本的一小部分。
主要成本是:缺少与本机整数相对应的整数类型(使所有整数运算成本大大增加),缺少静态类型(这使方法的解析更加困难,并且意味着必须检查值的类型)在运行时),并且缺少取消装箱的值(这样可以减少内存使用量,并可以避免某种程度的间接访问)。
并非所有这些事情在Python中都是不可能实现的,或者不能使其变得更加高效,而是已经做出选择,是为了使程序员更方便,更灵活,以及在运行时速度上提高语言的清晰度。通过聪明的JIT编译可以克服其中的一些费用,但是Python提供的好处总是要付出一定的代价。
python和C之间的区别是解释型(字节码)和编译型(本机)语言之间的通常区别。就我个人而言,我并不真正认为python这么慢,它可以正常运行。当然,如果您尝试在其领域之外使用它,则速度会变慢。但是为此,您可以为python编写C扩展,它将对时间要求严格的算法放入本机代码中,从而使其速度更快。
除了已经发布的答案之外,还有一件事是python能够在运行时更改您在C中无法更改的内容。您可以随时向类添加成员函数。而且,python的动态特性使我们无法说出将什么类型的参数传递给函数,这反过来使优化工作更加困难。
RPython似乎是解决优化问题的一种方法。
尽管如此,对于数字压缩等而言,它的性能可能不会接近C。
Python通常实现为脚本语言。这意味着它要经过一个解释器,这意味着它会即时将代码翻译成机器语言,而不是从一开始就将可执行文件全部翻译成机器语言。结果,除了执行代码外,它还必须支付翻译代码的费用。即使CPython即使编译为更接近机器语言的字节码也是如此,因此可以更快地翻译。Python还提供了一些非常有用的运行时功能,例如动态类型,但是即使没有最昂贵的运行时成本,即使在最有效的实现中,也通常无法实现这些功能。
如果您正在做非常耗费处理器的工作,例如编写着色器,那么Python的运行速度要比C ++慢200倍,这并不少见。如果您使用CPython,那么时间可以减少一半,但是仍然远远没有那么快。所有这些小东西都会带来一个代价。有很多基准可以证明这一点,这是一个特别好的基准。正如首页所承认的那样,基准是有缺陷的。它们都是由用户提交的,这些用户将尽力以自己选择的语言编写高效的代码,但这给了您一个很好的总体思路。
如果您担心效率问题,我建议您将两者混为一谈:那么,您可以同时兼顾两者。我主要是C ++程序员,但我认为很多人倾向于在C ++中编写平凡的高级代码,而这样做却很麻烦(编译时间只是一个示例)。将脚本语言与更接近金属的高效语言(如C / C ++)混合使用,实际上是平衡程序员效率(生产率)和处理效率的一种方法。
将C / C ++与Python进行比较不是一个公平的比较。就像比较F1赛车和多功能卡车一样。
令人惊讶的是,与其他动态语言的同类相比,Python的速度有多快。尽管该方法通常被认为是有缺陷的,但请查看《计算机语言基准测试》,以了解类似算法上的相对语言速度。
与Perl,Ruby和C#的比较更加“公平”
C和C ++编译为本地代码-即它们直接在CPU上运行。Python是一种解释型语言,这意味着您编写的Python代码必须经过很多很多抽象阶段才能成为可执行的机器代码。
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并不是一种慢编程语言