Python生成器收益字典

时间:2019-09-17 14:14:58

标签: python-3.x generator

我有一个函数,该函数产生大量数据并将其存储在要在函数末尾返回的字典中。但是,有人告诉我它在内存方面效率不高,我应该在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))



如何转换此代码块并利用数据生成器/产量?

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

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

但是在上述情况下,应在产生前先将所有必要的数据附加到字典中。我该怎么做?

1 个答案:

答案 0 :(得分:0)

这取决于您要如何使用数据,在上面的代码中,您正在创建所有值并立即对其进行处理。当您想一次处理一个数据(或一次处理一批)时,生成器很有用

您可以在此处修改代码

x  <- read.table(header=TRUE, text="   inwyys  yrbrn2  yrbrn3  yrbrn4  yrbrn5  yrbrn6  yrbrn7  yrbrn8
1   2012    1949    1955     NA      NA      NA      NA       NA
2   2012    1983    1951    1956    1989    1995    2003     2005
3   2012    1946    1946    1978     NA      NA      NA       NA 
4   2013     NA      NA      NA      NA      NA      NA       NA
5   2013    1953    1959    1980    1985    1991    2008     2011
6   2013    1938     NA      NA      NA      NA      NA       NA")

然后您可以按以下方式处理数据

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

        else:
            yield ("random", dataz[v]["val"]) 

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