前提・実現したいこと
データセットがキーのアルファベット記号と要素の数字からなる辞書型で与えられており、
数字はリストに格納されています。リストの長さはキーによって様々です。
各キーの要素の数字間でそれぞれ、たすき掛けで掛け算し、最も大きいものを採用した上で、
配列の長さで割った値を2つのキー間の値として出力します。
これを大規模なデータセットで実行することを実現したいです。
発生している問題・エラーメッセージ
小規模なデータセットでは問題なく実行できますが、
このコードで、データセットのキーの数が大規模(例えば3万など)な場合、
1つのキーに対してたすき掛けの計算で比較する対象も膨大になるため、
現行のコードのまま実行すると膨大な時間がかかってしまいます。
そこで、並列処理を行いたいのですが、どのようにコードを改変すればいいかわからず、
アドバイスをいただきたいです。
該当のソースコード
python
1 2data = { 3 'A':[1, 3, 5, 2, 1, 8, 9], 4 'B':[9, 4, 3], 5 'C':[8, 5, 5, 6, 1] 6} 7 8output = {} 9 10for alph, nums in data.items(): 11 avg = {} 12 my_list = data[alph] 13 for target_alph, target_nums in data.items(): 14 target_list = data[target_alph] 15 if alph == target_alph: 16 continue 17 max_nums = [] 18 19 for i in my_list: 20 max_num = 0 21 for j in target_list: 22 result = i * j 23 if result is not None and result > max_num: 24 max_num = result 25 max_nums.append(max_num) 26 avg[target_alph] = sum(max_nums) / len(max_nums) 27 output[alph] = avg 28print(output)
出力(一行だと長いため、改行してあります)
{ {'A': {'B': 37.285714285714285, 'C': 33.142857142857146}, 'B': {'A': 48.0, 'C': 42.666666666666664}, 'C': {'A': 45.0, 'B': 45.0}} }
ご回答を受けて試したこと
関数に切り出してみたのですが、うまく切り出すことができず、
エラーが出てしまいました。関数内でも、alphとtarget_alphを使用する必要があるため、関数を用いてもうまく効率化する術がわかりません。
python
1#!/usr/bin/env python 2# coding: utf-8 3 4data = { 5 'A':[1, 3, 5, 2, 1, 8, 9], 6 'B':[9, 4, 3], 7 'C':[8, 5, 5, 6, 1] 8} 9 10output = {} 11 12for alph, nums in data.items(): 13 avg = {} 14 my_list = nums 15 for target_alph, target_nums in data.items(): 16 target_list = target_nums 17 """ 18 if alph == target_alph: 19 continue 20 max_nums = [] 21 22 for i in my_list: 23 max_num = 0 24 for j in target_list: 25 result = i * j 26 if result is not None and result > max_num: 27 max_num = result 28 max_nums.append(max_num) 29 """ 30 avg[target_alph] = avg_of_max(my_list, target_list) 31 output[alph] = avg 32print(output) 33 34 35def avg_of_max_nums(my_list, target_list): 36 for alph, nums in data.items(): 37 for target_alph, target_nums in data.items(): 38 if alph == target_alph: 39 continue 40 max_nums = [] 41 42 for i in my_list: 43 max_num = 0 44 for j in target_list: 45 result = i * j 46 if result is not None and result > max_num: 47 max_num = result 48 max_nums.append(max_num) 49 return sum(max_nums) / len(max_nums)
エラー文
$ python sample.py File "sample.py", line 49 return sum(max_nums) / len(max_nums) ^ IndentationError: unindent does not match any outer indentation level
補足情報(FW/ツールのバージョンなど)
python3.6
回答3件
あなたの回答
tips
プレビュー