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 检查数组元素是否存在类似PHP isset()方法
Oct 14 Python
跟老齐学Python之模块的加载
Oct 24 Python
Python文件操作之合并文本文件内容示例代码
Sep 19 Python
python的exec、eval使用分析
Dec 11 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
python for循环输入一个矩阵的实例
Nov 14 Python
python实现简单的文字识别
Nov 27 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
Sep 30 Python
pandas按条件筛选数据的实现
Feb 20 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
Javascript浅谈之this
2013/12/17 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python的print用法示例
2014/02/11 Python
Python中的模块和包概念介绍
2015/04/13 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
试述DBMS的主要功能
2016/11/13 面试题
软件缺陷的分类都有哪些
2014/08/22 面试题
怎样客观的做好自我评价
2013/12/28 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
争先创优演讲稿
2014/09/15 职场文书
出国留学单位推荐信
2015/03/26 职场文书
单位考核鉴定意见
2015/06/05 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB