importmatplotlib.pyplotasplt
importseabornassns
importwarnings
warnings.filterwarnings(ignore)
#设置中文字体
%load_extcython
%matplotlibinline
一、Python为什么运行效率低?
第一:python是动态语言
python进行编程的时候,不像在java或者c++中,需要设置变量的类型,如字符串类型,整型,浮
点型等等。在代码的编译过程中,需要知道变量的类型,从而对不同的类型做不同的处理,如变量
该占多少内存、变量之间能否进行运算等等。但是,在编写python代码的过程中,并不会声明其
类型,所以需要python编译器去主动判断类型,如是否是个字符串还是个整数等等。而这一过
程,要耗费大量的计算资源。
第二:python是解释执行
python是一种解释性语言,python在执行代码的时候,会在后台启动一个编译器,这个编译器的
目的在于将源代码编译成字节码。一般,在编译成字节码之后,python虚拟机会使用这个字节码
与硬件进行交互,完成代码的执行任务。由于程序和硬件之间要途径虚拟机来进行交互,所以效率
会比较低。
第三:python中一切都是对象。
每个对象都需要维护引用计数,增加了额外的工作。
第四:全局解释锁(GIL)
因为GIL,python中的多线程并不能真正的并发。如果是在IObound的业务场景,这个问题并不
大,但是在CPUBOUND的场景,这就很致命了。所以笔者在工作中使用python多线程的情况并
不多,一般都是使用多进程(prefork),或者在加上协程。即使在单线程,GIL也会带来很大的
性能影响,因为python每执行100个opcode(默认,可以通过sys.setcheckinterval()设置)就会
尝试线程的切换,具体的源代码在ceval.c::PyEval_EvalFrameEx。
第五:内存管理
这个可能是所有具有垃圾回收的编程语言的通病。python采用标记和分代的垃圾回收策略,每次
垃圾回收的时候都会中断正在执行的程序,造成所谓的顿卡。
第六:高级数据结构、函数和库
Python提供了许多高级数据结构(如列表、字典、集合),这些结构提供了便利的抽象,但它们
的底层实现可能涉及复杂的内存操作;某些内置函数或外部库和库可能没有针对特定任务进行优
化。
二、优化Python代码执行速度的方法
1.使用内置数据类型和函数:Python的内置数据类型和函数通常经过高度优化,使用它们可以显著提高
代码的执行速度。
2.减少全局变量的使用:全局变量的访问速度通常比局部变量慢,因此应尽量减少全局变量的使用。
3.使用列表推导式和生成器:列表推导式和生成器可以简洁地表达复杂的循环逻辑,并且通常比传统的
循环结构更快。
4.利用向量化操作:对于数值计算任务,尽量使用NumPy、Pandas等库的向量化操作,避免使用
Python的循环结构。
5.并行计算:虽然Python的GIL限制了多线程的并行执行,但可以使用多进程、异步IO或分布式计算
框架(如Dask、Celery)来实现并行计算。
6.代码分析和性能测试:使用cProfile、timeit等工具对代码进行性能分析和测试,找出性能瓶颈并进行
优化。
7.使用JIT编译器:如PyPy这样的JIT编译器可以在运行时将Python代码编译成机器码,从而提高执
行速度。
8.优化算法和数据结构:选择更高效的算法和数据结构可以显著减少计算量,提高代码的执行速度。
9.减少外部库和依赖:尽量使用Python标准库中的功能,减少外部库和依赖的使用,以减少潜在的性
能问题。
10.使用Cython或PyOpenCL:对于需要高性能计算的部分,可以使用Cython将Python代码转换为
C代码进行编译,或者使用P