时间:2021-07-01 10:21:17 帮助过:35人阅读
动态类型
Python是动态类型而不是静态类型的,这意味着,在程序执行时,解释器并不知道变量的类型。对C语言来说,编译器在声明变量的时候就知道其类型了;对Python来说,程序执行时只知道一个变量是某种Python对象。
对于下面的C代码
int a = 1; int b = 2; int c = a + b;
编译器始终知道a和b是整型,在执行相加运算时,流程如下:
把<int> 1赋值给a
把<int> 2赋值给b
调用binary_add<int, int>(a, b)
把结果赋值给c
实现同样功能的Python代码如下:
a = 1 b = 2 c = a + b
相关推荐:《Python视频教程》
解释器只知道1和2是对象,但是并不知道这个对象的类型。所以解释器必须检查每个变量的PyObject_HEAD才能知道变量类型,然后执行对应的相加操作,最后要创建一个新的Python对象来保存返回值,大致流程如下:
第一步,把1赋值给a
1.设置a->PyObject_HEAD->typecode为整型
2.设置a->val = 1
第二步,把2赋值给b
1.设置a->PyObject_HEAD->typecode为整型
2.设置b->val = 2
第三步,调用binary_add<int, int>(a, b)
1.a->PyObject_HEAD获取类型编码
2.a是一个整型;值为a->val
3.b->PyObject_HEAD获取类型编码
4.b是一个整型,值为b->val
5.调用binary_add<int, int>(a->val, b->val)
6.结果为整型,存在result中
第四步,创建对象c
1.设c->PyObject_HEAD->typecode为整型
2.设置c->val为result
动态类型意味着任何操作都会涉及更多的步骤。这是Python对数值操作比C语言慢的主要原因
Python是解释型语言
上面介绍了解释型代码和编译型代码的一个区别。智能的编译器可以提前预见并优化重复或不需要的操作,这会带来性能的提升。编译器是一个大的话题,这里不会展开。
Python的对象模型会带来低效的内存访问
和C语言的整数对比时,我们指出了Python多了额外一层信息。现在来看看数组的情况。在Python中我们可以使用标准库中提供的List对象;而在C语言中我们会使用基于缓冲区的数组。
最简单的NumPy数组是围绕C数据构建的Python对象,也就是说它有一个指向连续数据缓存区的指针。而Python的list具有指向连续的指针缓冲区的指针,这些指针每个都指向一个Python对象,结合上面的例子,这些Python对象是一个整数对象。这个结构像下面这样
很容易看出,如果你正在执行按顺序逐步完成数据的操作,numpy的内存布局比Python的内存布局更为高效,无论是存储成本还是访问的时间成本。
以上就是为什么python慢的详细内容,更多请关注Gxl网其它相关文章!