編集のために働いていない:アップルMBPを実行 2017 2.8GHzのi7の4コアを持つモデル14,3:Pythonのマルチプロセッシングが遅く、本当にオブジェクトメソッド
multiprocessing.cpu_count()
8
私が行ってるオブジェクトのリストを持っていますPythonでオブジェクトごとに1回オブジェクトメソッドを実行します。このプロセスは遺伝的アルゴリズムのためのものなので、私はそれを高速化することに興味があります。基本的には、データリストのデータで環境を更新するたびに、オブジェクト(ゲノム)は環境から値を取り出し、それ自身の内部値を参照するなど、少しの計算を実行します。
私がやっている:
from multiprocessing import Pool
class Individual(object):
def __init__(self):
self.parameter1 = None
self.parameter2 = None
def update_values():
# reads the environment variables, does math specific to each instance
# updates internal parameters
a, b, c, d = environment_variables
self.parameter1 = do_math(a, b, c, d,
self.parameter1, self.parameter2)
self.parameter2 = do_math(a, b, c, d,
self.parameter1, self.parameter2)
data_list = [data1, data2, data3, ..., data1000]
object_list = [object1, object2, object3, ..., object20000]
を私はこれを実行した場合:
for newdataset in data_list:
update_parameters(newdataset)
for object in object_list:
object.update_values()
をそれは私がマルチプロセッシング/マップを使用して、これを分割しようとした場合よりも高速ずっとです:
def process_object(object):
object.update_values()
for newdataset in data_list:
update_parameters(newdataset)
with Pool(4) as p:
p.map(process_object, object_list)
object_listの長さが200(20000ではなく)で実行すると、合計スレッド時間はシングルスレッドモードで14.8秒になります。 マルチプロセッシングモードで同じものを実行すると、合計時間は...まだ待っています... ok ... 211秒です。
また、関数が何をすべきかとは言いません。私はここで何が欠けていますか?各オブジェクトの値をチェックすると、それらは全く更新されていないように見えます。
どのような処理が行われているかについて少し詳しく説明できますか?また、コア数はいくつですか?どのようなOSですか? – vasia
また、プロセスに渡されるすべてのパラメータは、シリアル化可能でなければなりません。したがって、object_listにはどのようなオブジェクトがありますか(クラスインスタンスはデフォルトではシリアル化されません) – Sergius
マルチプロセッシングは[pickle](https://docs.python.org/3/library/pickle.html)を使用してデータをシリアライズし、クラスと再帰構造を処理できます。 –