我有一个流程,用于收集整周生成的报告,并整合收集以消除相同的报告。
我编写了一个函数,通过查找具有相同索引的那些来识别相同的报告,然后它排除了除了其中一个相同并继续前进之外的所有报告。虽然它适用于5000-10,000个报告,但它开始花费大量时间来处理,例如,50,000多个报告,随着时间的推移,这将越来越常见。
如果我可以先发制人地删除报告并因此避免这一步骤,那将是很好的,但生成报告的过程不允许这样做。所以,我想找到一种方法来使这个或类似的功能更有效。
代码如下:
def report_diff_index(self,dnc_data,folders):
master_report_dict, master_val_dict = self.report_orderer(folders)
sorts = self.report_sorter(dnc_data,master_report_dict)
keys = [k for k in sorts.keys()]
consolidated_sorts = keys
print('Original Report Size: ', len(consolidated_sorts))
for k in keys:
if k in consolidated_sorts:
for j in keys[keys.index(k)+1:]:
if j in consolidated_sorts:
if len(list(set(sorts[k].index).symmetric_difference(sorts[j].index))) == 0:
consolidated_sorts.remove(j)
print('Consolidated Report Size: ', len(consolidated_sorts))
consolidated_report = {}
consolidated_val = {}
for s in consolidated_sorts:
consolidated_report[s] = master_report_dict[s]
consolidated_val[s] = master_val_dict[s]
return consolidated_report, consolidated_val
答案 0 :(得分:1)
我不知道我是否正确理解你的问题,即使我这样做,我也不知道这是否更快,但是不可能创建一个dict,你可以使用唯一的报告索引作为键(例如使用frozenset
)然后将报告键作为值。感觉这是建立唯一列表的更快捷方式,但我可能会离开:
def report_diff_index(self,dnc_data,folders):
master_report_dict, master_val_dict = self.report_orderer(folders)
sorts = self.report_sorter(dnc_data,master_report_dict)
print('Original Report Size: ', len(sorts))
unique_reports = dict()
for report_key, report in sorts.items:
key = frozenset(report.index)
# Alt 1. Replace with new (identical) repoirt
unique_reports[key] = report_key
# Alt 2. Keep first report
if key not in unique_reports:
unique_reports[key] = report_key
consolidated_sorts = unique_reports.values()
print('Consolidated Report Size: ', len(consolidated_sorts))
consolidated_report = {}
consolidated_val = {}
for s in consolidated_sorts:
consolidated_report[s] = master_report_dict[s]
consolidated_val[s] = master_val_dict[s]
return consolidated_report, consolidated_val
正如您所看到的,dict更新中还有两个选项,这取决于您是要保留第一个找到的报告还是无关紧要。
插入dict应该接近O(1)因此我会想象这很快。
答案 1 :(得分:0)
如果我错了,请纠正我,但它看起来像是:
consolidated_sorts = keys
print('Original Report Size: ', len(consolidated_sorts))
for k in keys:
if k in consolidated_sorts:
for j in keys[keys.index(k)+1:]:
if j in consolidated_sorts:
if len(list(set(sorts[k].index).symmetric_difference(sorts[j].index))) == 0:
consolidated_sorts.remove(j)
只是寻找独特的报道。实际上,迭代是多余的,因为您首先将consolidated_sorts
设置为等于keys
,然后迭代这些值并询问它们是否在consolidated_sorts
中,这是它们的来源。
如果你只想要独特的键,你可以尝试这样的事情:
def report_diff_index(self,dnc_data,folders):
master_report_dict, master_val_dict = self.report_orderer(folders)
sorts = self.report_sorter(dnc_data,master_tree)
# New code to create unique set of keys
unique_keys = set(sorts.keys())
consolidated_report = {}
consolidated_val = {}
for key in unique_keys:
consolidated_report[key] = master_report_dict[key]
consolidated_val[key] = master_val_dict[key]
return consolidated_report, consolidated_val