我有這樣的:緩慢的Python代碼似乎適合itertools:如何優化?
entity_key = 'pid'
data = [ { ... }, { ... } ]
entities = list(set([ row[entity_key] for row in data ]))
parsed = []
total_keys = ['a','b','c']
for entity_id in entities:
entity_rows = [ row for row in data if row[entity_key] == entity_id ]
totals = { key: sum(filter(None, [ row.get(key) for row in entity_rows ])) for key in total_keys }
totals[entity_key] = entity_id
parsed.append(totals)
return parsed
我的方案,data
約30,000個項目,這是大的。
的每一項都是一個dict
,每個dict
包含在total_keys
定義的每個項目,例如標識符pid
,和數值{ 'pid': 5011, 'a': 3, 'b': 20, 'c': 33 }
如您所見,代碼將爲每個pid
返回一個唯一行的列表,並在total_keys
列表中定義加法列。可能有大約800-1000個獨特的pid
值,因此parsed
最終大約有800-1000個項目。
這很慢。我試圖用itertools.groupby
重新寫這個,但它似乎不是最合適的。有沒有我失蹤的魔法?
過濾器只需使用'總和(行[關鍵] ...如果行鍵...)',這也是快於使用GET請求,你也要先創建一個列表,然後一再次設置一個列表,只需使用一組'實體= {row [entity_key]作爲行中的數據}' –