首页 / PYTHON / python中生成器对象的大小
python中生成器对象的大小
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python中生成器对象的大小,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2693字,纯文字阅读大概需要4分钟。
内容图文
![python中生成器对象的大小](/upload/InfoBanner/zyjiaocheng/697/ab39df09375b4dc18cfba90567b1fa58.jpg)
对于以下代码:
import sys
x=(i for i in range(1,11))
print x
print 'Before starting iterating generator size is' ,sys.getsizeof(x)
print 'For first time'
for i in x:
print i
print 'For second time , does not print anything'
for i in x:
print i # does not print anything
print 'After iterating generator size is' ,sys.getsizeof(x)
输出是:
<generator object <genexpr> at 0x014C1A80>
Before starting iterating generator size is 40
For first time
1
2
3
4
5
6
7
8
9
10
For second time
After iterating generator size is 40
生成器对象的大小最初是40,当我完成迭代时它仍然是40.但是没有元素从第二个循环引用.
为什么生成器对象在创建时会占用相同的内存,并且在完成迭代时会占用相同的内存?
解决方法:
发电机在内存中占用的空间只是簿记信息.其中保留了对框架对象的引用(管理正在运行的Python代码,例如本地代码),现在它正在运行,并保留对代码对象的引用.而已:
>>> x=(i for i in range(1,11))
>>> dir(x)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'next', 'send', 'throw']
>>> x.gi_frame
<frame object at 0x1053b4ad0>
>>> x.gi_running
0
>>> x.gi_code
<code object <genexpr> at 0x1051af5b0, file "<stdin>", line 1>
这只是3个引用,加上通常的Python对象类型信息(思考引用计数)和弱引用列表;这是大约4个指针,一个整数和一个结构,在你的系统上占用40个字节(在我的系统上,64位OS X,它是80个字节). sys.getsizeof()报告在C中实现的该结构的大小,并且它不会递归指针.
因此,当您运行生成器时,该内存量不会更改.引用的帧可能会改变使用的内存量(如果生成器表达式引用大对象朝向一端或另一端)但是您不会在生成器对象上看到sys.getsizeof()的结果;改为查看框架本地:
>>> next(x)
1
>>> x.gi_frame.f_locals
{'i': 1, '.0': <listiterator object at 0x105339dd0>}
.0对象是生成器在for循环中使用的range()迭代器,i是for循环目标. listiterator是另一个可迭代对象,它具有对列表range()的私有引用以及位置计数器,因此每次请求它时它都可以产生下一个元素.
您无法查询生成器的元素大小;无论如何,它们都会根据需要生成元素,你不能事先“知道”它们会产生多少,也不能知道它们在运行后产生了多少. sys.getsizeof()肯定不会告诉你;它无论如何都是一种测量内存占用的工具,如果你想知道总占用空间,你必须递归测量所有引用的对象.
你可以看到发电机已完成从框架的运行;一旦完成就会被清除:
>>> x.gi_frame
<frame object at 0x1053b4ad0>
>>> list(x)
[2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> x.gi_frame is None
True
所以最后,用于生成器的内存驻留在帧中的结构中(本地,可能是全局,这些名称空间中的每个对象可能再次引用其他对象),并且当生成器完成时,帧被清除并且生成器.gi_frame指针被更改为指向None单例,如果引用计数已降至0,则将帧清除.
所有这些只适用于发电机,而不适用于一般的迭代;生成器是Python代码,因此可以深入反思.
内容总结
以上是互联网集市为您收集整理的python中生成器对象的大小全部内容,希望文章能够帮你解决python中生成器对象的大小所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。