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 相关文章推荐
python2.6.6如何升级到python2.7.14
Apr 08 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
python实现字符串和字典的转换
Sep 29 Python
Django model序列化为json的方法示例
Oct 16 Python
200行python代码实现2048游戏
Jul 17 Python
Python占用的内存优化教程
Jul 28 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
基于python实现音乐播放器代码实例
Jul 01 Python
Python是怎样处理json模块的
Jul 16 Python
python中turtle库的简单使用教程
Nov 11 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
HTML DOM的nodeType值介绍
2011/03/31 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
详解python字节码
2018/02/07 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
医院办公室主任职责
2013/12/29 职场文书
2014年最新学习全国两会精神心得
2014/03/17 职场文书
水利水电专业自荐信
2014/07/08 职场文书
如何解决.cuda()加载用时很长的问题
2021/05/24 Python