动态类型是如何一步步拖慢你的python程序的
off999 2025-06-23 21:20 51 浏览 0 评论
杂谈
人人都知道python慢,这都变成了人尽皆知的事情了,但你知道具体是什么拖慢了python的运行吗?
动态类型肯定要算一个!
动态类型,能够提高开发效率,能够让我们更加专注逻辑开发,使得编程更加灵活。
a = 1
a = 'a'
a = 2.3你完全不需要定义变量的类型,尽管写代码即可,解释器将动态判断变量的类型。
当然,有了动态类型,肯定有一种静态类型与之对应,很多很多语言都是静态的,比如 C、JAVA、C#、C++等等,它们的特点是要强制确定变量类型。
// C
int a = 1;一、慢性毒药——类型检查
静态类型的语言中,每个类型检查在编译期就已经确定了;而python在运行过程中才会确定类型,而且每次变量被访问,都需要确定当前类型才能进一步执行,这都需要 CPU 参与进来。
这就像两种流水线,一条静态类型的流水线仅需要一次检查即可;另一条动态类型的流水线,每次货物来了都需要安排人去检查,这肯定会影响性能。
不同的流水线工作方式
特别是在密集的计算过程中,会进行大量的 类型检查,那么计算性能就会变得很差,这就是为什么很多计算库都通过 C、C++或其它编译型静态语言 来实现的重要原因。
二、优化壁垒——无法进行静态优化
静态类型的语言可以通过一些手段,来优化代码,以此来提升程序的性能,比如 循环展开、死代码消除、常量传播等。
但是动态类型的语言就很难做到提前优化来提升性能,它必须在运行期间才能知道类型,就没法做到以上的那些操作。
这就像静态类型语言在考试前先把试卷的 所有问题看一遍,然后再做答;但动态类型语言就像真正的 闭卷考试,所有问题只有答题时才能知道。
提前知道考题,做题速度当然快
三、天生的胖子——内存开销大
静态类型的语言,丁是丁,卯是卯,一个 int 类型该是4字节就是4字节。
但python的动态类型可不是,要知道python是一个 纯面向对象 的语言,所有东西都是对象,它并不是纯粹的数据类型,这将消耗额外的内存来存储对象。
这就说明python是天生的胖子,它的内存消耗天然就是要大。
python天然的内存消耗大
四、优化思路
4.1 使用JIT编译器
我们可以用 JIT技术 来运行程序,提高性能,比如 PyPy,下载后直接用它进行运行:
pypy your_script.py关于JIT技术本文不阐述,以后再开篇文章来说!
4.2 计算密集型使用性能更佳的库
当你需要执行大量计算,不要使用python原生的计算方式,采用 numpy、scipy 等库来执行将跳过动态类型检查,提升性能。
4.3 使用静态类型语言开发结合python
这个操作适合大佬,直接使用 Cython 来开发,结合python使用。
五、总结
很多人看到这里可能都不敢用python了,其实不用担心,我们一般情况下是用不到性能瓶颈的,依赖于现在日益强大的硬件,很多程序都能流畅运行。
动态类型虽然性能上打了折扣,但是实在在提高了开发效率,能够更加快速地实现我们的想法,正所谓 鱼和熊掌不可兼得,有牺牲肯定有回报。
相关推荐
- win7系统卡顿怎么优化(win7很慢很卡怎么优化)
-
1、首先打开安全卫士,进入安全卫士首页,单击软件窗口右下角的“更多”图标,打开扩展应用程序。2、单击选择“我的工具”。3、在我的工具菜单里面找到“人工服务”单击打开人工服务。4、在人工服务对话框有很多...
- 如何查看c盘微信聊天记录(如何查看c盘微信聊天记录内存大小)
-
微信群中的消息只要没删除基本都能保存,想要找微信群中几个多月前的消息可以直接根据日期来查找聊天记录。操作如下:1、打开想要查找记录的微信群,点击右上角人形图标;2、点击查找聊天内容;3、选择按日...
- office2016家庭版激活密钥(office家庭版激活码2019)
-
走淘宝吧,因为零售版的密钥只能用一次。大概几块钱就能激活2016。如果你不在乎钱的话可以向我一样,订阅一个office365.实在不行可以和几个人一起买一个家庭版的365.出现这个情况,找微软申诉是没...
- 移动硬盘驱动器下载安装(移动硬盘驱动器下载安装教程)
-
1、右键单击您的桌面,选择“新建文件夹”,并命名该文件夹(例如“usb驱动程序”);2、然后到本站下载驱动程序;3、将其解压缩至在您的桌面上刚刚创建的usb驱动程序文件夹;4、单击开始菜单,然后选择设...
- 电脑硬盘格式化工具(电脑 格式化硬盘)
-
硬盘格式化工具很多,PQMACGIG8.0(中文就叫硬盘分区魔法师)是比较好的一个,这个是在WINDOWS下比叫好用,(个人感觉)FDISK也是比较好的一个,这个一般用在DOS下分区格式化WIN...
- photoshop是一款什么软件(ps指的是什么软件)
-
这个说法是错误的,ps软件“即:photoshop”是由美国著名的“adobe阿多比”公司出品的专业的图像处理软件,它不是由微软公司出品的软件。众所周知的是,微软公司以设计视窗操作系统名满全球,它出...
- ipad越狱的好处与坏处(ipad越狱好不好)
-
好处一: 1、重命名、重组应用程序 如果你看着Sparrow(iOS最优秀邮件客户端)这个名字不爽,越狱之后就可以改成“Email”,如果你觉得“豆瓣电台”这个名字不给力,那就改成“中央人民广...
- win7光盘重装系统步骤图解(win7光盘如何重装系统)
-
1.确认您的电脑支持从光盘启动。如果支持,可以直接将Windows7安装光盘插入电脑的光驱中。 2.打开电脑,按下F2、F10、F12或Delete等键进入BIOS设置界面。 ...
- 电脑已联网却无法上网(电脑已经联网了但是不能上网)
-
电脑连上网后,仍可能存在无法上网的情况,这可能是由多种原因造成的。以下是一些可能的原因和解决方法:1.浏览器问题:有时候,浏览器可能会出现故障,导致无法正常访问网络。您可以尝试清除浏览器的缓存和co...
- u盘价格一览表(u盘单价)
-
不同品牌价格不同,不同内存价格也不同,例如8g、16g、32g、64g等多种容量大小的,根据容量的不同,报价在29元到120元之间不等。闪存盘虽然小,但相对来说却有很大的存储容量。U盘大多能够存储比一...
- windows查看ip命令(windows如何查看ip地址)
-
查看电脑IP: 1)使用Windows+R键打开“运行”窗口,然后输入CMD进入命令提示窗口2)进入命令窗口之后,输入:ipconfig/all回车即可...
- 内存条的作用(内存条的作用和参数配置)
-
内存条是存储电脑运行所需的数据和程序,帮助CPU快速读取和运行,提高计算机的运行速度和处理能力。内存条也被称为随机存取存储器(RAM),是电脑中非常必要的一个组件。常见的内存条类型有DDR、DDR2、...
- autocad2012安装失败(autocad2012无法安装)
-
如果您遇到CAD2012安装不了的问题,可能有几个原因导致这种情况。以下是一些常见的解决方法:1.确保系统要求:首先,请确保您的计算机符合CAD2012的系统要求。检查您的操作系统版本、内存、处理器...
- win11 16g内存最佳虚拟内存(window10 16个g虚拟内存设置)
-
内存足够大可以将系统的虚拟内存关掉。1、鼠标右键【此电脑】,在菜单中选择【属性】。2、进入属性后,点击【高级系统设置】。3、进入系统属性后,点击高级下面的【设置】。4、进入性能设置后,点击【高级】。5...
- 查看windows7激活码(win7激活码哪里看)
-
windows7激活密钥如下:PPBK3-M92CH-MRR9X-34Y9P-7CH2FQ8JXJ-8HDJR-X4PXM-PW99R-KTJ3H8489X-THF3D-BDJQR-D27PH-P...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
