Я пытаюсь измерить производительность некоторых алгоритмов в моем ноутбуке Jupyter. У меня есть 6 входов, на которых нужно протестировать, и они требуют времени для запуска, поэтому я хотел бы ускорить его, распараллеливая код. Я новичок в Python, поэтому я не понимаю, что я делаю неправильно.
Я запустил кластер в своем терминале следующим образом:
ipcluster start -n 6
Я создал клиента, подобного этому:
from ipyparallel import Client
c = Client()
v = c[:]
И я пытаюсь распараллелить так:
v.map(lambda x: time_algorithm(optimized_hcs, x, h1), states)
Где states
- список объектов, а time_algorithm
выглядит так:
def time_algorithm(function, state, heuristic=None):
timeitresult = 0
if heuristic is None:
timeitresult = %timeit -o -q function(state)
else:
timeitresult = %timeit -o -q function(state, heuristic)
return sum(timeitresult.all_runs) / len(timeitresult.all_runs)
Я получаю полную ошибку:
---------------------------------------------------------------------------
PicklingError Traceback (most recent call last)
<ipython-input-64-ea578c0689fa> in <module>
----> 1 v.map(lambda x: time_algorithm(optimized_hcs, x, h1), states)
<d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\decorator.py:decorator-gen-142> in map(self, f, *sequences, **kwargs)
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\client\view.py in sync_results(f, self, *args, **kwargs)
50 self._in_sync_results = True
51 try:
---> 52 ret = f(self, *args, **kwargs)
53 finally:
54 self._in_sync_results = False
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\client\view.py in map(self, f, *sequences, **kwargs)
621 assert len(sequences) > 0, "must have some sequences to map onto!"
622 pf = ParallelFunction(self, f, block=block, **kwargs)
--> 623 return pf.map(*sequences)
624
625 @sync_results
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\client\remotefunction.py in map(self, *sequences)
297 and mismatched sequence lengths will be padded with None.
298 """
--> 299 return self(*sequences, __ipp_mapping=True)
300
301 __all__ = ['remote', 'parallel', 'RemoteFunction', 'ParallelFunction']
<d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\decorator.py:decorator-gen-132> in __call__(self, *sequences, **kwargs)
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\client\remotefunction.py in sync_view_results(f, self, *args, **kwargs)
78 view = self.view
79 if view._in_sync_results:
---> 80 return f(self, *args, **kwargs)
81 view._in_sync_results = True
82 try:
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\client\remotefunction.py in __call__(self, *sequences, **kwargs)
261 if sum([len(arg) for arg in args]) == 0:
262 continue
--> 263 args = [PrePickled(arg) for arg in args]
264
265 if _mapping:
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\client\remotefunction.py in <listcomp>(.0)
261 if sum([len(arg) for arg in args]) == 0:
262 continue
--> 263 args = [PrePickled(arg) for arg in args]
264
265 if _mapping:
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\serialize\serialize.py in __init__(self, obj)
42 """
43 def __init__(self, obj):
---> 44 self.buffers = serialize_object(obj)
45
46
d:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\ipyparallel\serialize\serialize.py in serialize_object(obj, buffer_threshold, item_threshold)
123 buffers.extend(_extract_buffers(cobj, buffer_threshold))
124
--> 125 buffers.insert(0, pickle.dumps(cobj, PICKLE_PROTOCOL))
126 return buffers
127
PicklingError: Can't pickle <class '__main__.Client'>: it's not the same object as __main__.Client