我有一个函数,该函数产生大量数据并将其存储在要在函数末尾返回的字典中。但是,有人告诉我它在内存方面效率不高,我应该在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
但是在上述情况下,应在产生前先将所有必要的数据附加到字典中。我该怎么做?
答案 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"])
这样,您将保存字典占用的内存。在并行处理的情况下,这也将是有效的。例如使用生成器获取和处理新数据时会有一些延迟,而从某些来源获取数据时,可以在不同的线程或机器中并行处理