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 k-近邻算法实例分享
Jun 11 Python
编程语言Python的发展史
Sep 26 Python
详解详解Python中writelines()方法的使用
May 25 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
python+opencv识别图片中的圆形
Mar 25 Python
python程序控制NAO机器人行走
Apr 29 Python
Python从函数参数类型引出元组实例分析
May 28 Python
python导入pandas具体步骤方法
Jun 23 Python
python 装饰器功能与用法案例详解
Mar 06 Python
Python 存取npy格式数据实例
Jul 01 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
去除python中的字符串空格的简单方法
Dec 22 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模拟HTTP认证
2006/10/09 PHP
PHP脚本数据库功能详解(上)
2006/10/09 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
window.location.hash 属性使用说明
2010/03/20 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
jquery mobile实现拨打电话功能的几种方法
2013/08/05 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
详解vue-cli3使用
2018/08/14 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
浅析Python与Mongodb数据库之间的操作方法
2019/07/01 Python
python函数的万能参数传参详解
2019/07/26 Python
淘宝客服工作职责
2014/07/11 职场文书
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
详解如何使用Nginx解决跨域问题
2022/05/06 Servers