为什么python慢

爱喝马黛茶的安东尼
Lepaskan: 2019-06-25 16:07:50
asal
3042 orang telah melayarinya

Python是一种动态类型,解释性的语言,对于很多开发者来说,Python运行慢是众所周知的事情,其万物皆对象的特性,就是导致其运行慢的一个原因,下面将从三个方面来分析Python慢的原因。

为什么python慢

动态类型

Python是动态类型而不是静态类型的,这意味着,在程序执行时,解释器并不知道变量的类型。对C语言来说,编译器在声明变量的时候就知道其类型了;对Python来说,程序执行时只知道一个变量是某种Python对象。

对于下面的C代码

int a = 1;
int b = 2;
int c = a + b;
Salin selepas log masuk

编译器始终知道a和b是整型,在执行相加运算时,流程如下:

1赋值给a

2赋值给b

调用binary_add(a, b)

把结果赋值给c

实现同样功能的Python代码如下:

a = 1
b = 2
c = a + b
Salin selepas log masuk

相关推荐:《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(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中

第四步,创建对象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的内存布局更为高效,无论是存储成本还是访问的时间成本。

Atas ialah kandungan terperinci 为什么python慢. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan