0

0

python为什么慢?

青灯夜游

青灯夜游

发布时间:2019-05-22 14:54:12

|

2485人浏览过

|

来源于php中文网

原创

python一种动态类型,解释性的语言,对于很多开发者来说,python运行慢是众所周知的事情,其万物皆对象的特性,就是导致其运行慢的一个原因,下面本篇文章就来给大家介绍一下python慢的一些原因,希望对你们有所帮助。

python为什么慢?

python是动态性语言不是静态性语言

这是说在python程序执行的时候,编译器不知道变量的类型。在C中编译器知道变量在定义时的类型,而python中执行的时候只知道它是一个对象。

因此,如果您在C中编写以下内容:

/ * C代码* /
int  a  =  1 ;
int  b  =  2 ;
int  c  =  a  +  b ;

C编译器从一开始就知道a并且b是整数:它们根本不可能是其他任何东西!有了这些知识,它可以调用添加两个整数的例程,返回另一个整数,它在内存中只是一个简单的值。

立即学习Python免费学习笔记(深入)”;

在C中执行的流程大概如下:

1、 分配1给a;

2、分配2给b;

3、 调用二进制加法binary_add(a, b)(a, b);

4、将结构分配给c变量

python中等效的代码如下:

# python code
a = 1
b = 2
c = a + b

这里解释器只知道1和2是对象,但不知道它们是什么类型的对象。 因此解释器必须检查每个变量的PyObject_HEAD以找到类型信息,然后为这两种类型调用适当的求和例程。 最后,它必须创建并初始化一个新的Python对象来保存返回值。 

执行流程大致如下:

1、分配1给a    

    (1)设置a->PyObject_HEAD->typecode为整数

    (2)设置Seta->val = 1

2、分配2给b

    (1)设置b->PyObject_HEAD->typecode为整数

    (2)设置b->val = 2

3、调用二进制加法binary_add(a, b)

    (1)找到类型代码 a->PyObject_HEAD

    (2)a是整数,值为a->val

    (3)找到类型代码 b->PyObject_HEAD

    (4)b是整数,值为b->val

    (5)调用二进制加法binary_add(a->val, b->val)

    (6)结果是result,是一个整数。

4、创建一个新的对象c

    (1)设置c->PyObject_HEAD->typecode为整数

    (2)将c->val分配给结果

动态类型意味着任何操作都需要更多的步骤。这是Python在数值数据操作方面比C慢的主要原因。

python是解释性语言而不是编译性语言

解释型语言与编译型语言它们本身的区别也会造成程序在执行的时候的速度差异。一个智能化的编译器可以预测并针对重复和不需要的操作进行优化。这也会提升程序执行的速度。

Python的对象模型会带来低效的内存访问

在上面的例子中,相对于C语言,在python中对整数进行操作会有一个额外的类型信息层。当有很多的整数并且希望进行某种批操作时,在python中往往会使用一个list,而在C中会使用某个基于缓存区的数组。在Numpy数组的最简单的形式是一个围绕着C中的数组建的一个python对象。也就是说Numpy有一个指针指向连续缓存区数据的值,而在python中,python列表有一个只想缓存区的指针,每个指针都指向一个python缓存对象,而且每个对象都绑定一个数据(本例中是整数)。

这两种情况的原理图:

2.jpg

从上图可以很明显的看出,当对数据进行操作时(例如排序、计算、查找等),无论是在存续成本还是访问成本上,Numpy都比python更加的高效。

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

3

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

15

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 1.0万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号