У меня есть список из 100 кортежей tuplelist
, которые служат входами для внешней функции.Внешняя функция возвращает значение, и это значение добавляется в массив следующим образом (MainFile.py
):
from ExternalPythonFile import ExternalFunction
valuelist = []
for a,b in tuplelist:
value = ExternalFunction(a,b)
# more functions here
valuelist.append(value)
print(len(valuelist))
Выход для print(len(valuelist))
при использовании вышеуказанного цикла for равен (100,)
.
Теперь, поскольку порядок кортежей и способ их добавления не имеют значения в моем случае, я хотел распараллелить цикл for, поскольку для обработки 100 кортежей потребуется ~ 10 минут, и яожидая масштабировать это число.Я попробовал реализацию Joblib ниже (MainFileJoblib.py
):
from ExternalPythonFile import ExternalFunction
from joblib import Parallel, delayed, parallel_backend
import multiprocessing
valuelist = []
def TupleFunction(a,b):
value = ExternalFunction(a,b)
# more functions here
valuelist.append(value)
with parallel_backend('multiprocessing'):
Parallel(n_jobs=10)(delayed(TupleFunction)(a,b) for a,b in tuplelist)
print(len(valuelist))
Я выполняю все это на вычислительном кластере Unix, но время выполнения все равно было примерно таким же: ~ 8 мин.Вывод также был неверным, он напечатал (0,)
.
Глядя на htop
Я обнаружил, что на самом деле используется 10 ядер, но каждое ядро используется только на 20%.
Iтакже попытался запустить реализацию joblib через SLURM:
srun --ntasks=1 --ncpus-per-task=10 python3 MainFileJoblib.py
, которая была определенно быстрее примерно через ~ 2 мин, но опять же это дало неправильный результат (0,)
.
Что лучшеспособ распараллелить оригинальный цикл for?