以下のコードを並列化すると、attributes 列の要素数が 15 近くあるため、結合に時間がかかります。
combs = set()
for L in range(0,len(attributes)+1):
combs.add(itertools.combinations(attributes,L))
マルチプロセッシングを使用して並列化する方法はありますか?
これを試しましたが、このエラーが発生しています。- チャンクサイズ <= 0 の場合:
TypeError: 順序付けできない型: range() <= int()
import itertools
from multiprocessing import Pool
def comb(attributes):
res = itertools.combinations(attributes)
return res
def main():
p = Pool(4)
times = range(0,len(attributes)+1)
values = p.map(comb,attributes,times)
p.close()
p.join()
print(values)
if __name__ == '__main__':
attributes =('Age', 'Workclass', 'Fnlwgt', 'Education', 'Education-num', 'marital-status', 'Occupation', 'Relationship', 'Race', 'Sex', 'Capital-gain', 'Capital-loss', 'Hours-per-week', 'Native country', 'Probability', 'Id')
main()
質問の説明を求められたので、どうぞ・・・。基本的にn!. たとえば、属性変数に A、B、C がある場合、(A)、(B)、(C)、(A、B)、(A、C)、(A、B、 C)。属性の要素数は静的ではなく、入力データセットに基づいて変化するため、ハードコーディングできません。したがって、ここでは len(attributes) を使用しています。属性はデータセットの属性を格納します。次に、組み合わせを作成するために、 itertools.combinations(attributes,L) は通常、長さ L のすべての組み合わせを作成します。私の例では、長さ (attributes) を指定すると、ABC のみが取得され、他の組み合わせは取得されません。だから私は長さの範囲を作成し、それを1つ追加してゼロ番目の要素に取り組みました。
問題に戻ると、データセットに 15 個の要素が含まれている可能性があるため、長さ (属性) は 15、つまり 15! になります。この階乗を行う必要があるため、この組み合わせの生成には多くの時間がかかります。したがって、各プロセッサが一度に 1 つの組み合わせセットの生成を処理する方法でこれを並列化することを考えています。たとえば、1 つのプロセッサが長さ 2 と長さ 3 のすべての組み合わせを生成します。複数の引数を適切に渡すことができません。これで状況が解決することを願っています。さらに説明が必要な場合はお知らせください。