python为什么慢?
python是动态性语言不是静态性语言
这是说在python程序执行的时候,编译器不知道变量的类型。在C中编译器知道变量在定义时的类型,而python中执行的时候只知道它是一个对象。
因此,如果您在C中编写以下内容:
/ * C代码* / int a = 1 ; int b = 2 ; int c = a + b ;
C编译器从一开始就知道a并且b是整数:它们根本不可能是其他任何东西!有了这些知识,它可以调用添加两个整数的例程,返回另一个整数,它在内存中只是一个简单的值。
在C中执行的流程大概如下:
1、 分配<int>1给a;
2、分配<int>2给b;
3、 调用二进制加法binary_add(a, b)<int,int>(a, b);
4、将结构分配给c变量
python中等效的代码如下:
# python code a = 1 b = 2 c = a + b
这里解释器只知道1和2是对象,但不知道它们是什么类型的对象。 因此解释器必须检查每个变量的PyObject_HEAD以找到类型信息,然后为这两种类型调用适当的求和例程。 最后,它必须创建并初始化一个新的Python对象来保存返回值。
执行流程大致如下:
1、分配1给a
(1)设置a->PyObject_HEAD->typecode为整数
(2)设置Seta->val = 1
2、分配2给b
(1)设置b->PyObject_HEAD->typecode为整数
(2)设置b->val = 2
3、调用二进制加法binary_add(a, b)
(1)找到类型代码 a->PyObject_HEAD
(2)a是整数,值为a->val
(3)找到类型代码 b->PyObject_HEAD
(4)b是整数,值为b->val
(5)调用二进制加法binary_add(a->val, b->val)
(6)结果是result,是一个整数。
4、创建一个新的对象c
(1)设置c->PyObject_HEAD->typecode为整数
(2)将c->val分配给结果
动态类型意味着任何操作都需要更多的步骤。这是Python在数值数据操作方面比C慢的主要原因。
python是解释性语言而不是编译性语言
解释型语言与编译型语言它们本身的区别也会造成程序在执行的时候的速度差异。一个智能化的编译器可以预测并针对重复和不需要的操作进行优化。这也会提升程序执行的速度。
Python的对象模型会带来低效的内存访问
在上面的例子中,相对于C语言,在python中对整数进行操作会有一个额外的类型信息层。当有很多的整数并且希望进行某种批操作时,在python中往往会使用一个list,而在C中会使用某个基于缓存区的数组。在Numpy数组的最简单的形式是一个围绕着C中的数组建的一个python对象。也就是说Numpy有一个指针指向连续缓存区数据的值,而在python中,python列表有一个只想缓存区的指针,每个指针都指向一个python缓存对象,而且每个对象都绑定一个数据(本例中是整数)。
这两种情况的原理图:
从上图可以很明显的看出,当对数据进行操作时(例如排序、计算、查找等),无论是在存续成本还是访问成本上,Numpy都比python更加的高效。
以上就是python为什么慢?的详细内容,更多请关注其它相关文章!