为什么python慢


本文摘自php中文网,作者爱喝马黛茶的安东尼,侵删。

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

动态类型

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

对于下面的C代码

1

2

3

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代码如下:

1

2

3

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慢的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

如何保存Python代码

Python操作mysql模拟银行转账操作的简单实例

Python 多维切片之冒号和三个点

Python 为什么效率低

Python注释符是什么意思

Python django是什么

Python如何输出换行

Python中pandas和xlsxwriter读写xlsx文件的方法介绍(附代码)

怎么查看一个对象的类型

Python基础学习if语句

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...