Python程序慢的重要原因

作者:Ly 时间:2023-10-08 16:17:40 

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语言慢的主要原因

来源:https://www.py.cn/faq/python/18442.html

标签:Python,程序慢
0
投稿

猜你喜欢

  • 关于长度单位pt、px、dpi的误解

    2008-06-01 13:30:00
  • Javascript的匿名函数

    2008-05-07 13:33:00
  • 网站中美好的细节

    2011-07-13 18:43:07
  • 通过事务日志解决SQL Server常见四大故障(一)

    2009-03-25 13:46:00
  • gethostbyaddr在Python3中引发UnicodeDecodeError

    2023-06-15 09:34:33
  • text-indent 隐藏文字时出现的 outline问题

    2007-12-02 17:31:00
  • SQL语句参考及记录集对象详解

    2008-11-25 11:47:00
  • Bootstrap3制作自己的导航栏

    2023-08-23 02:13:08
  • Mootools 1.2教程(5)——事件处理

    2008-11-19 16:33:00
  • 了解WEB页面工具语言XML(六)展望

    2008-09-05 17:19:00
  • ORACLE 数据库RMAN备份恢复

    2009-04-24 12:23:00
  • ORCLE 表中列的修改

    2009-07-28 10:42:00
  • 思考关于搜索框的设计

    2008-12-09 18:17:00
  • 网页设计进阶之六-- 守住那些不能丢的东西

    2008-06-12 13:06:00
  • 用Dreamweaver MX轻松操作表格

    2009-05-29 18:41:00
  • asp的分词技术

    2007-08-25 17:50:00
  • Go语言通过Luhn算法验证信用卡卡号是否有效的方法

    2023-07-23 17:28:07
  • 用正则替换所有URL

    2009-03-13 13:51:00
  • 列表模块是否需要标题

    2009-06-25 14:11:00
  • 防采集,几种觉得有用的防采集方法

    2009-09-03 13:30:00
  • asp之家 网络编程 m.aspxhome.com