本文主要是详细介绍Pyhon的代码优化,以Pyhon的记数体制做为引进,详细介绍Pyhon的代码优化方法,感兴趣的小伙伴来了解一下吧
什么是内存管理模式
python中建立的目标情况下,都会先进行申请基址,再对目标开展复位,全部目标都是会维护保养在同一个
个称为refchain的双重循环链表中,每一个数据储存如下所示信息内容:
import sys a=[11,22]#对象被创建 b=a#对象被别的变量引用 c=[111,222,333,a]#对象被作为元素,放在容器中 #获取对象的引用计数 print(sys.getrefcount(a))#对象被当成参数传递到函数中
1.单链表中数据前后左右数据库的指示针
2.数据的类型
3.数据值
4.数据库的引用计数
5.数据库的长短(list,dict..)
import sys
del b#对象的别名被显式的销毁
b=999#对象的一个别名被赋值给其他对象
del c#列表被销毁(容器被销毁)
c.pop()#把列表数据最后一个删除掉(对象从容器中被移除)
一、引用计数体制
引用计数提升:
1.1目标被建立
1.2目标被其他自变量引入(此外取了个名称)
1.3目标被认为是原素,放到容器里(比如被当做原素放到页面上)
1
1.4目标被当做传递数据到函数中
importsys a=[11,22]#目标被建立 b=a#目标被其他自变量引入 c=[111,222,333,a]#目标被认为是原素,放到容器里 #获取对象的引用记数 print(sys.getrefcount(a))#目标被当做传递数据到函数中
最后的执行结果是,a这个自变量被引用了4次
引用计数减少:
目标别名被显式的消毁
目标一个别名被赋值给其他目标(例:比如原来的a=10,被改成a=100,此时10的引用计数就减少了)
目标从容器里被移除,或者容器被消毁(例:目标从页面上被移除,或者列表被消毁)
一个引入离开了它的作用域(调用函数的时候传进去的参数,在函数运行结束后,该参数的引入即被消毁)
importsys
delb#目标别名被显式的消毁
b=999#目标一个别名被赋值给其他目标
delc#列表被消毁(容器被消毁)
c.pop()#把列表数据最后一个删除掉(目标从容器里被移除)
二、数据池和缓存文件
数据池分为两种:小整数金额池和大整数金额池
小整数金额池(-5到256之间的信息)
运行机制:Python自动将-5~256的整数金额进行了缓存文件到一个小整数金额池中,当你将这些整数金额赋值给自变量时,并不会重新
创建对象,而是使用早已建立好的缓存文件目标,当删除这些数据的引入时,也不会开展回收
超出-5到256的整数金额将无法在缓存文件,会再次创建对象
比如:
针对超出-5到256的整数金额将无法在缓存文件,Python会再次创建对象,回到id
#情景1:数据为列表,没有在-5~256的范围 >>>a=[11] >>>b=[11] >>>id(a),id(b) (1693226918600,1693231858248)========》id不同 #情景二:数据为整数金额,在-5~256的范围 >>>aa=11 >>>bb=11 >>>id(aa),id(bb) (140720470385616,140720470385616)id同样 #情景三:数据没有在-5~256的范围 >>>bb=-7 >>>aa=-7 >>>id(aa),id(bb) (1843518717904,1843518717776)id不同 #情景四:数据没有在-5~256的范围 >>>a=257 >>>b=257 >>>id(a),id(b) (2092420910928,2092420911056)id不同
大整数金额池(字符串数组停留池/intern机制)
优势:在建立一个新的字符串对象时,首先会在缓存文件池里边找是否存在早已存有的值同样对象(标志符,即只包括数据、英文字母、下横线的字符串数组),若是有,则立即拿出来用(引入),防止频繁地建立和消毁运存,提升工作效率
比如:
针对没有在标志符内的信息将无法在缓存文件,Python会再次创建对象,回到id
#情景1: >>>a='123adsf_' >>>b='123adsf_' >>>id(a),id(b) (61173296,61173296)========》id同样 #情景二: >>>b1='123adsf_?' >>>b2='123adsf_?' >>>id(b1),id(b2) (61173376,61173416)id不同 #场景1:数据为列表,不在-5~256的范围 >>>a=[11] >>>b=[11] >>>id(a),id(b) (1693226918600,1693231858248)========》id不一样 #场景二:数据为整数,在-5~256的范围 >>>aa=11 >>>bb=11 >>>id(aa),id(bb) (140720470385616,140720470385616)id一样 #场景三:数据不在-5~256的范围 >>>bb=-7 >>>aa=-7 >>>id(aa),id(bb) (1843518717904,1843518717776)id不一样 #场景四:数据不在-5~256的范围 >>>a=257 >>>b=257 >>>id(a),id(b) (2092420910928,2092420911056)id不一样
缓存机制
针对python中常见内嵌基本数据类型的缓存文件:
float:缓存文件100个目标
list:80个目标
dict:80个目标
set:80个目标
#场景1: >>>a='123adsf_' >>>b='123adsf_' >>>id(a),id(b) (61173296,61173296)========》id一样 #场景二: >>>b1='123adsf_?' >>>b2='123adsf_?' >>>id(b1),id(b2) (61173376,61173416)id不一样 数组:会依据数组数据库的长短,各自缓存文件数组长短为0-20对象
综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/128852.html
摘要:让你收获满满码个蛋从年月日推送第篇文章一年过去了已累积推文近篇文章,本文为年度精选,共计篇,按照类别整理便于读者主题阅读。本篇文章是今年的最后一篇技术文章,为了让大家在家也能好好学习,特此花了几个小时整理了这些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 让你收获满满! 码个蛋从2017年02月20...
摘要:且本小白也亲身经历了整个从小白到爬虫初入门的过程,因此就斗胆在上开一个栏目,以我的图片爬虫全实现过程为例,以期用更简单清晰详尽的方式来帮助更多小白应对更大多数的爬虫实际问题。 前言: 一个月前,博主在学过python(一年前)、会一点网络(能按F12)的情况下,凭着热血和兴趣,开始了pyth...
摘要:至于怎样下载付费网易云音乐,还是开个会员吧,要知道免费是最贵的的这个道理。代码写完了,那还等什么,运行一下装逼啊这下好了,装逼失败,被网易云认出来我是爬虫的,那我试试加下请求头结果加了还是一个样,这个也算是个巨坑吧。 前两天教了大家如何在控制台上找到真实的mp3播放地址,但是不可以下载付费的,因为只能下载可播放的歌曲。至于怎样下载付费网易云音乐,还是开个会员吧,要知道免费是最贵的的这个...
摘要:两数之和暴力求解首先我们需要有一个目标列表,并且有一个目标值。如果列表中的某两个数之和,正好等于我们的目标值,那么就会反回那两个数的索引。 两数之和----------暴力求解 首先我们需要有一个目标列表,并且有一个目标值。如果列表中的某两个数之和,正好等于我们的目标值,那么就会反回那两个数...
阅读 946·2023-01-14 11:38
阅读 923·2023-01-14 11:04
阅读 780·2023-01-14 10:48
阅读 2123·2023-01-14 10:34
阅读 994·2023-01-14 10:24
阅读 884·2023-01-14 10:18
阅读 535·2023-01-14 10:09
阅读 611·2023-01-14 10:02