【问题标题】:Python Generator Yield DictionaryPython 生成器产量字典
【发布时间】:2020-01-18 10:27:12
【问题描述】:

我有一个函数,它产生大量数据并将它们存储在一个字典中,该字典将在函数末尾返回。但是有人告诉我,它在内存方面效率不高,我应该在 Python 中使用数据生成器。

例子:

def gen_data(dataz):
    data_dict = {"uniqz":[], "random":[]}

    for v in dataz:
        if dataz[v]["row"] == "ay1":
            data_dict["uniqz"].append(dataz[v]["row"])
        else:
            data_dict["random"].append(dataz[v]["val"])

    return data_dict

dataz = {"ax1":{"row":"ay1","val":2},
                "ax2":{"row":"ay2","val":3}}

print(gen_data(dataz))



如何转换这段代码并使用数据生成器/yield?

我知道如何生成单个字典数据,例如:

for i in xrange(num_people):
        datadict = {
                    'id': i
                }
        yield datadict 

但在上述场景中,它应该在屈服之前先将所有必要的数据附加到字典中。我该怎么做?

【问题讨论】:

    标签: python-3.x generator


    【解决方案1】:

    这取决于您希望如何使用数据,从上面的代码中,您正在创建所有值并立即处理它。当您想一次处理一个数据(或一次处理一批数据)时,生成器非常有用

    在这里你可以像这样修改你的代码

    def gen_data(dataz):
        for v in dataz:
            if dataz[v]["row"] == "ay1":
                yield ("uniqz", dataz[v]["row"])
    
            else:
                yield ("random", dataz[v]["val"]) 
    
    

    然后你可以像下面这样处理你的数据

    for key, value in gen_data(dataz):
        process(key, value)
    

    这样可以节省字典占用的内存。这在并行处理的情况下也是有效的。例如获取新数据以及使用生成器处理它时会有一些延迟,当您从某个来源获取数据时,它可以在不同的线程或机器中并行处理

    【讨论】:

    • 如果我想要调用函数的代码中的完整字典数据怎么办?归根结底,如果我要从 yield 函数中获取所有结果,我仍然将完整数据存储在一个变量中,这将占用相同的内存大小?例如场景 1:将数据存储在字典中并返回它与场景 2:产生数据,获取所有值并在调用时存储在字典中。
    • 是的,如果您一次需要内存中的所有数据,那么使用生成器没有意义,但在大多数情况下,我们只需要整个数据的一些聚合值,或者我们将数据存储到文件或发送在这种情况下通过网络是有道理的。例如如果使用yield通过网络发送数据,让我们在获取时发送数据以进行处理,而不是在发送之前等待所有数据加载
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2011-01-01
    • 2019-04-10
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多