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实现的HTTP并发测试完整示例
Apr 23 Python
Python中tell()方法的使用详解
May 24 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
Pycharm远程调试openstack的方法
Nov 21 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
python批量修改文件夹及其子文件夹下的文件内容
Mar 15 Python
python简单实现AES加密和解密
Mar 28 Python
python装饰器的特性原理详解
Dec 25 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 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 cookis创建实现代码
2009/03/16 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
js实现随机数字字母验证码
2017/06/19 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
python fabric实现远程部署
2017/01/05 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
什么是属性访问器
2015/10/26 面试题
部队党性分析材料
2014/02/16 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
介绍信的写法
2015/01/31 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
pytorch中的numel函数用法说明
2021/05/13 Python
详解Redis集群搭建的三种方式
2021/05/31 Redis
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python