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操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
python getopt详解及简单实例
Dec 30 Python
使用Python生成XML的方法实例
Mar 21 Python
PyQt5实现拖放功能
Apr 25 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
python从ftp获取文件并下载到本地
Dec 05 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
如何通过一篇文章了解Python中的生成器
Apr 02 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调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
详解Python打包分发工具setuptools
2019/08/05 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python读写压缩文件的方法
2020/07/30 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
String是最基本的数据类型吗?
2013/06/13 面试题
中专毕业生自荐信
2013/11/16 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python
Vue2.0搭建脚手架
2022/03/13 Vue.js