Python运行速度慢的原因:1、python是解释性语言;2、Python是动态语言;3、Python中一切都是对象;4、Python GIL;5、垃圾回收机制。python是解释性语言是指,Python在运行文件程序时,解释器将源代码转换为字节码,然后再由解释器来执行这些字节码,过程复杂,速度较慢。
一、Python运行速度慢的原因
1、python是解释性语言
python是一个解释性的动态类型脚本语言,解释性语言的特点就是程序只有在执行的时候才会去编译,也就是说边执行边进行编译。而Java、C这种编译性的语言在程序执行之前就已经将其编译为机器可读的代码了,自然运行速度快。而且python程序在没有运行之前都是能够直接以源码的形式存在的,这也是它能够跨平台运行的主要原因,但是在没有经过编译的python运行速度上就会有所降低。
2、Python是动态语言
动态语言是一类在运行时可以改变其结构的语言,如新的函数、对象、代码可以被引入,已有的函数可以被删除或其他结构上的变化等,该类语言更具有活性,但是不可避免的因为运行时的不确定性也影响运行效率。数据的比较和转换类型的开销很大,每次读取、写入或引用一个变量,都要检查类型。很难优化一种极具动态性的语言。Python的许多替代语言之所以快得多,原因在于它们为了性能在灵活性方面作出了牺牲。
3、Python中一切都是对象
Python是一门面向对象的编程语言,其设计理念是一切皆是对象,如数字、字符串、元组、列表、字典、函数、方法、类、模块等都是对象,包括代码,每个对象都需要维护引用计数,因此,增加了额外工作,影响了性能。
4、Python GIL
GIL是Python最为诟病的一点,因为GIL,Python中的多线程并不能真正的并发,即使在单线程,GIL也会带来很大的性能影响,因为python每执行100个opcode就会尝试线程的切换,因此,影响Python运行效率。
5、垃圾回收机制
Python采用标记和分代的垃圾回收策略,每次垃圾回收的时候都会中断正在执行的程序,造成所谓的顿卡,影响运行效率。
二、提升Python性能的方案
1、Cython
是Python的C语言扩展,cPython是一门单独的语言,专门用来写在Python里面的import用的扩展库。CPython跟Python语法基本一致,而CPython有专门的编译器。据说,Cython提供了一些特性来让代码更高效,比如变量类型化,这本质上是C要求的。一些科学计算的包,如scikit-learn依赖Cython的一些特性来保持操作简洁快速。
2、Pyston
Pyston,由Dropbox资助,使用LLVM编译器架构来加速Python,同样的它也使用了适时编译。相比于PyPy,Pyston还处于早期阶段,它只支持Python的部分特性。Pyston把工作分成两个部分,一部分是语言的核心特性,另一部分是把性能提升到可接受的程度。Pyston距离可以在生产环境使用还有一段距离
3、Nuitka
是一个Python的替代品,它可以将Python代码转换为C++代码,然后编译为可执行文件,并且通过调用Python的API的方式实现从解析语言到编译语言的转换,在转换到C++的过程中直接使用python的解释器,可以保证100%的语法兼容。
4、Numba
Numba结合了上面几个项目的想法。学习了Cython,Numba也采用了部分加速的策略,只加速CPU密集型的任务;同时它又学习了PyPy和Pyston,通过LLVM运行Python。你可以用一个装饰器指定你要用Numba编译的函数,Numba继承Numpy来加速函数的执行,Numba不做适时编译,它的代码是预先编译的。
5、PyPy
在选择CPython的简易替代语言时,pypy无疑时优异之选,与现有Python代码保持高度兼容性,pypy也是默认程序运行时的一个很好选择。PyPy使用了Just-in-Time即时编译器,动态编译器与静态编译器不同,利用程序运行的过程的数据进行优化。
PyPy使用适时编译来加速Python,这项技术Google也在使用,Google在V8引擎中使用它加速Javascript。最近的版本PyPy2.5增加了一些提升性能的特性,其中有一项很受欢迎,它集成了Numpy,Numpy之前也一直被用来加速Python的运行。
延伸阅读1:Python优势
Python最大的优势在于效率。有时候程序员或科研工作者的效率比机器的效率更重要,对于很多复杂性的功能,使用更加清晰的语言能给程序减少更多的负担,从而大大增强程序的质量,其易学性和扩展性也能让新手很快上手。虽然Python底层运行速度要比C语言慢,但Python清晰的结构能解放程序员的时间,同时很方便的和其他编程语言代码(如C语言)融合在一起。