0

我有一个收集一周内生成的报告并合并收集以消除相同报告的流程。

我编写了一个函数,通过查找具有相同索引的报告来识别相同的报告,然后排除所有相同的报告,然后继续前进。虽然它适用于 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
4

2 回答 2

1

我不知道我是否正确理解了您的问题,即使我理解了,我也不知道这是否更快,但是是否可以创建一个字典,在其中使用唯一的报告索引作为键(例如使用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) 因此我想这会相当快。

于 2017-06-27T19:13:28.827 回答
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
于 2017-06-27T18:26:27.773 回答