辞書に効率よく展開する必要があるオブジェクトのリストがあります。リストには2,000,000を超えるオブジェクトがあります。操作には1.5時間以上かかる。これをより効率的に行うことができるかどうかを知りたい。 リスト内のオブジェクトは、このクラスに基づいています。Python:オブジェクトのリストをDictionaryに展開する
class ResObj:
def __init__(self, index, result):
self.loc = index ### This is the location, where the values should go in the final result dictionary
self.res = result ### This is a dictionary that has values for this location.
self.loc = 2
self.res = {'value1':5.4, 'value2':2.3, 'valuen':{'sub_value1':4.5, 'sub_value2':3.4, 'sub_value3':7.6}}
現在のところ、この操作はこの操作を実行するために使用します。
def make_final_result(list_of_results):
no_sub_result_variables = ['value1', 'value2']
sub_result_variables = ['valuen']
sub_value_variables = ['sub_value1', 'sub_value3', 'sub_value3']
final_result = {}
num_of_results = len(list_of_results)
for var in no_sub_result_variables:
final_result[var] = numpy.zeros(num_of_results)
for var in sub_result_variables:
final_result[var] = {sub_var:numpy.zeros(num_of_results) for sub_var in sub_value_variables}
for obj in list_of_results:
i = obj.loc
result = obj.res
for var in no_sub_result_variables:
final_result[var][i] = result[var]
for var in sub_result_variables:
for name in sub_value_variables:
try:
final_result[var][name][i] = result[var][name]
except KeyError as e:
##TODO Add a debug check
pass
私は()。辞書やマネージャーmultiprocessing.Managerを使用して試してみました()。配列は、()しかし、私は唯一のにもかかわらず、私は手動で設定する(2つのプロセスが仕事を得ることができ、このために並列処理を使用しますプロセス数= 24)。 より速い方法でパフォーマンスを向上させてください。 ありがとうございます。
これはデータ構造や特に効率的なオブジェクトの初期化をうまく利用しているようには見えませんが、実際にどこから始めたのかは分かりません。入力と出力の例を教えてください。 –
マシン上で実行するのに1.5時間以上かかる短い自己完結型の '.py'ファイルを投稿してください:http://sscce.org/ – pts
あなたはネストされたループを持っているようです:' for var in no_sub_result_variables: 'と'for var in sub_result_variables:'です。本当にネストループをここに入れたいですか?もしそうなら、内部ループ変数の名前を 'var2'に変更してください。 – pts