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的Django框架代码的一些示例
Apr 20 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
python 执行shell命令并将结果保存的实例
May 11 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
Python实现微信翻译机器人的方法
Aug 13 Python
Python编写打字训练小程序
Sep 26 Python
python FTP批量下载/删除/上传实例
Dec 22 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
python实现文字版扫雷
Apr 24 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 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
基于empty函数的判断详解
2013/06/17 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
经典c++面试题二
2015/08/14 面试题
房地产员工找工作的自我评价
2013/11/15 职场文书
大学生自荐书范文
2013/12/10 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
就业协议书
2014/09/12 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
赵氏孤儿观后感
2015/06/09 职场文书