Python程序慢的重要原因


Posted in Python onSeptember 04, 2020

Python慢的重要原因:

1、python是动态性语言不是静态性语言

在python程序执行的时候,编译器不知道变量的类型。

2、python是解释性语言而不是编译性语言

解释型语言与编译型语言它们本身的区别也会造成程序在执行的时候的速度差异。一个智能化的编译器可以预测并针对重复和不需要的操作进行优化。这也会提升程序执行的速度。

3、 python的对象模型会导致访问内存效率低下

相对于C语言,在python中对整数进行操作会有一个额外的类型信息层。

当有很多的整数并且希望进行某种批操作时,在python中往往会使用一个list,而在C中会使用某个基于缓存区的数组。

内容扩展:

Python一种动态类型,解释性的语言,对于很多开发者来说,Python运行慢是众所周知的事情,其万物皆对象的特性,就是导致其运行慢的一个原因,这篇文章就是想聊聊这里面的一些细节。

慢的原因

由于各种原因,Python比Fortran和C语言慢。

动态类型

Pythn是动态类型而不是静态类型的,这意味着,在程序执行时,解释器并不知道变量的类型。下图可以用来说明C变量和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

解释器只知道1和2是对象,但是并不知道这个对象的类型。所以解释器必须检查每个变量的PyObject_HEAD才能知道变量类型,然后执行对应的相加操作,最后要创建一个新的Python对象来保存返回值,大致流程如下:

把1赋值给a

  • 设置a->PyObject_HEAD->typecode为整型
  • 设置a->val = 1

把2赋值给b

  • 设置a->PyObject_HEAD->typecode为整型
  • 设置b->val = 2

调用binary_add<int, int>(a, b)

  • a->PyObject_HEAD获取类型编码
  • a是一个整型;值为a->val
  • b->PyObject_HEAD获取类型编码
  • b是一个整型,值为b->val
  • 调用binary_add<int, int>(a->val, b->val)
  • 结果为整型,存在result中

创建对象c

设c->PyObject_HEAD->typecode为整型

设置c->val为result

动态类型意味着任何操作都会涉及更多的步骤。这是Python对数值操作比C语言慢的主要原因

到此这篇关于Python程序慢的重要原因的文章就介绍到这了,更多相关Python慢的重要原因内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python写入xml文件的方法
May 08 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
Tensorflow之Saver的用法详解
Apr 23 Python
详解Python if-elif-else知识点
Jun 11 Python
Flask框架配置与调试操作示例
Jul 23 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
python单例设计模式实现解析
Jan 07 Python
容易被忽略的Python内置类型
Sep 03 Python
浅析Django接口版本控制
Jun 26 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 #Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 #Python
Django实现微信小程序支付的示例代码
Sep 03 #Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 #Python
一篇文章搞懂python的转义字符及用法
Sep 03 #Python
容易被忽略的Python内置类型
Sep 03 #Python
python类共享变量操作
Sep 03 #Python
You might like
PHP入门速成(2)
2006/10/09 PHP
PHP的宝库目录--PEAR
2006/10/09 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
python设计模式大全
2016/06/27 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
python计算日期之间的放假日期
2018/06/05 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
Python连接Impala实现步骤解析
2020/08/04 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
北京SQL新华信咨询
2016/09/30 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技