当前位置: 首页 > 面试题库 >

Python生成器对象:__sizeof __()

须志新
2023-03-14
问题内容

这可能是一个愚蠢的问题,但是我还是会问。我有一个生成器对象:

>>> def gen():
...     for i in range(10):
...         yield i
...         
>>> obj=gen()

我可以测量它的大小:

>>> obj.__sizeof__()
24

据说发电机会被消耗掉:

>>> for i in obj:
...     print i
...     
0
1
2
3
4
5
6
7
8
9
>>> obj.__sizeof__()
24

…但obj.__sizeof__()保持不变。

使用字符串可以按我的预期工作:

>>> 'longstring'.__sizeof__()
34
>>> 'str'.__sizeof__()
27

如果有人能启发我,我将不胜感激。


问题答案:

__sizeof__()不按照您的想法去做。该方法返回给定对象的内部大小(以字节为单位),而不是生成器将要返回的项目数。

Python无法事先知道生成器的大小。以下面的无限生成器为例(例如,有更好的方法来创建计数器):

def count():
    count = 0
    while True:
        yield count
        count += 1

那个发电机是无止境的。没有可分配的大小。但是生成器对象本身占用内存:

>>> count.__sizeof__()
88

通常,__sizeof__()您通常不会调用该sys.getsizeof()函数,而这会增加垃圾回收器的开销。

如果您 知道 生成器将是有限的,并且 必须 知道它会返回多少个项目,请使用:

sum(1 for item in generator)

但请注意,这会使发电机 耗尽



 类似资料:
  • 问题内容: 在下面的: 我知道any(…)内部是一个生成器对象。我不明白的是缺少括号-如果括号属于any()函数,在生成器表达式周围是否应该有另一组括号? 谢谢。 问题答案: 当仅在一个参数中使用函数调用时,可以省略括号,生成器表达式语法专门允许使用该括号。 仅带有一个参数的调用可以省略括号。有关详细信息,请参见“通话”部分。

  • 我使用pyodbc和pandas-read_-sql从Oracle数据库中提取数据。 当我进入这一行时,我没有看到任何错误 但是当我试着看的时候 我得到这个错误 我对这一错误的含义或可能的原因进行了研究,但没有得出令人满意的答案。 使用chunksize的原因是我有一个包含6000万行的Oracle db表,并计划以位的形式下载,然后将它们放在一起,就像这里:如何从sql查询创建一个大数据帧而不耗

  • 问题内容: 在python中,如何检查对象是否为生成器对象? 试试这个- 给出错误- (我知道我可以检查对象是否具有将其用作生成器的方法,但是我想以某种方式可以确定任何对象的类型,而不仅仅是生成器。) 问题答案: 您可以从以下类型使用GeneratorType:

  • 前面章节中,已经详细介绍了什么是迭代器。生成器本质上也是迭代器,不过它比较特殊。 以 list 容器为例,在使用该容器迭代一组数据时,必须事先将所有数据存储到容器中,才能开始迭代;而生成器却不同,它可以实现在迭代的同时生成元素。 也就是说,对于可以用某种算法推算得到的多个数据,生成器并不会一次性生成它们,而是什么时候需要,才什么时候生成。 不仅如此,生成器的创建方式也比迭代器简单很多,大体分为以下

  • 我正在开发我的第一个FastAPI和Pydantic项目,在尝试从endpoint返回生成器时遇到了一个问题。问题在下面,任何投入都将不胜感激! 我有一个 API endpoint,我首先从数据库中获取数据记录,然后使用 map 函数格式化每条记录。但是,将映射结果返回到终结点时,键值映射出错。请注意,出于性能考虑(大数据量),我想将endpoint的返回类型保留为生成器。 我的伪代码: 这样,我

  • 是否有方法重写build方法返回SampleClass以避免执行build.build?