Python中的内存管理之python list内存使用详解_第1页
Python中的内存管理之python list内存使用详解_第2页
Python中的内存管理之python list内存使用详解_第3页
Python中的内存管理之python list内存使用详解_第4页
Python中的内存管理之python list内存使用详解_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Python中的内存管理之pythonlist内存使用详解使用Python的时候,我们知道list是一个长度可变对的数组,可以通过insert,append和extend轻易的拓展其中的元素个数。也可以使用运算符如:[1]+[2]生成新的数组[1,2]

extend()、"+"、"+="的区别

"+"将两个list相加,会返回到一个新的list对象

append在原list上进行修改,没有返回值

从以下代码可以看到,调用b=b+[3,4]之后,通过id(b)查看b变成了一个新对象。

In[5]:b=[1,2]

In[6]:id(b)

Out[6]:1628740249224

In[7]:b=b+[3,4]

In[8]:id(b)

Out[8]:1628740456520

使用extend()完成相同的步骤,可以看到对象c的id保持和原来的一致

In[9]:c=[1,2]

In[10]:id(c)

Out[10]:1628740392584

In[11]:c.extend([3,4])

In[12]:id(c)

Out[12]:1628740392584

使用"+="连接列表,看到效果和extend()是相同的。

In[1]:a=[1,2]

In[2]:id(a)

Out[2]:1628740021448

In[3]:a+=[3,4]

In[4]:id(a)

Out[4]:1628740021448

结论:减少内存的拷贝,修改一个列表的数据时,应避免使用list1=list1+list2这样的语法。

List的内存使用

一个示例:

In[1]:importsys

In[2]:lst1=[1]

In[3]:lst2=[]

In[4]:lst2.append(1)

In[5]:lst1==lst2

Out[5]:True

In[6]:sys.getsizeof(lst1)

Out[6]:72

In[7]:sys.getsizeof(lst2)

Out[7]:96

可以看到,lst1==lst2,但是当使用sys.getsizeof获取对象的内存大小时,两者却是不同的。

如下图所示,list_a长度为4,当执行append(4)时,底层的数据长度其实申请了4个元素的空间,当再次执行append(5)的时候,不需要再次申请内存。

因为执行append()操作时,Python将一次拓展N个元素的内存,因为一个append操作很可能是很多append操作的开始,通过额外分配内存来减少可能的内存分配和内存copy的次数。

In[1]:importsys

In[2]:l=[]

...:print(f'listinitialsize{sys.getsizeof(l)}')

...:foriinrange(80):

...:cur_size=sys.getsizeof(l)

...:l.append(i)

...:new_size=sys.getsizeof(l)

...:print(f'listlen{i+1}:\tcurrent_size{new_size}\tnew_allocated8*{(new_size-cur_size)/8}')

...:

listinitialsize64

listlen1:current_size96new_allocated8*4.0

listlen2:current_size96new_allocated8*0.0

listlen3:current_size96new_allocated8*0.0

listlen4:current_size96new_allocated8*0.0

listlen5:current_size128new_allocated8*4.0

listlen6:current_size128new_allocated8*0.0

listlen7:current_size128new_allocated8*0.0

listlen8:current_size128new_allocated8*0.0

listlen9:current_size192new_allocated8*8.0

listlen10:current_size192new_allocated8*0.0

listlen11:current_size192new_allocated8*0.0

listlen12:current_size192new_allocated8*0.0

listlen13:current_size192new_allocated8*0.0

listlen14:current_size192new_allocated8*0.0

listlen15:current_size192new_allocated8*0.0

listlen16:current_size192new_allocated8*0.0

listlen17:current_size264new_allocated8*9.0

listlen18:current_size264new_allocated8*0.0

listlen19:current_size264new_allocated8*0.0

listlen20:current_size264new_allocated8*0.0

listlen21:current_size264new_allocated8*0.0

listlen22:current_size264new_allocated8*0.0

listlen23:current_size264new_allocated8*0.0

listlen24:current_size264new_allocated8*0.0

listlen25:current_size264new_allocated8*0.0

listlen26:current_size344new_allocated8*10.0

listlen27:current_size344new_allocated8*0.0

listlen28:current_size344new_allocated8*0.0

listlen29:current_size344new_allocated8*0.0

listlen30:current_size344new_allocated8*0.0

listlen31:current_size344new_allocated8*0.0

listlen32:current_size344new_allocated8*0.0

listlen33:current_size344new_allocated8*0.0

listlen34:current_size344new_allocated8*0.0

listlen35:current_size344new_allocated8*0.0

listlen36:current_size432new_allocated8*11.0

listlen37:current_size432new_allocated8*0.0

listlen38:current_size432new_allocated8*0.0

listlen39:current_size432new_allocated8*0.0

listlen40:current_size432new_allocated8*0.0

listlen41:current_size432new_allocated8*0.0

listlen42:current_size432new_allocated8*0.0

listlen43:current_size432new_allocated8*0.0

listlen44:current_size432new_allocated8*0.0

listlen45:current_size432new_allocated8*0.0

listlen46:current_size432new_allocated8*0.0

listlen47:current_size528new_allocated8*12.0

listlen48:current_size528new_allocated8*0.0

listlen49:current_size528new_allocated8*0.0

listlen50:current_size528new_allocated8*0.0

listlen51:current_size528new_allocated8*0.0

listlen52:current_size528new_allocated8*0.0

listlen53:current_size528new_allocated8*0.0

listlen54:current_size528new_allocated8*0.0

listlen55:current_size528new_allocated8*0.0

listlen56:current_size528new_allocated8*0.0

listlen57:current_size528new_allocated8*0.0

listlen58:current_size528new_allocated8*0.0

listlen59:current_size640new_allocated8*14.0

listlen60:current_size640new_allocated8*0.0

listlen61:current_size640new_allocated8*0.0

listlen62:current_size640new_allocated8*0.0

listlen63:current_size640new_allocated8*0.0

listlen64:current_size640new_allocated8*0.0

listlen65:current_size640new_allocated8*0.0

listlen66:current_size640new_allocated8*0.0

listlen67:current_size640new_allocated8*0.0

listlen68:current_size640new_allocated8*0.0

listlen69:current_size640new_allocated8*0.0

listlen70:current_size640new_allocated8*0.0

listlen71:current_size640new_allocated8*0.0

listlen72:current_size640new_allocated8*0.0

listlen73:current_size768new_allocated8*16.0

listlen74:current_size768new_allocated8*0.0

listlen75:current_size768new

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论