Как реализовать параллельную обработку значений списка (англ. list)?
Добрый день, подскажите пожалуйста как распараллелить обработку списка (англ. list).
Ситуация такая, у меня после первичной обработки есть список , значений в нём около 2500.
Дальше список передаётся в функцию, которая последовательно вычисляет результаты. В один поток вычисление получается небыстрым, больше 5 минут.
Хочу попробовать обсчитать этот список параллельно.
Вопрос такой, перед распараллеливанием мне надо лист разделить на 3-4 части? Или Pyhton может как-то сам определить что список используется в параллельном вычислении и разделит внутренним процессом?
В 99% случаев медленная работа скрипта объясняется говнокодом, а реальная необходимость распараллеливания отсутствует. Вот пример. Покажите код и примеры данных.
Andrey Dugin, я удалил старый скрипт =) поэтому пример кода показать не могу.
Но там не сложная структура.
Скрипт используется библитеку для распознания лиц(face recognition), один из шагов это кодирование фотографий для нейросети.
Вот этот момент очень долго длиться , наверное от 10 секунд на фотографию. При этом процесор загружен процентов на 10. Хочу распараллелить этот шаг.
Структура была такая, берем список файлов из папки,
отдаем в цикл список, и поочереди кодируем .
А обработка она вот так выглядела, я правда обернул в функцию, но :
def convertEncoding(lookPhotos):
t = 0
unknowEncoded = []
for i in lookPhotos:
t= t+1
imageUnknow = face_recognition.load_image_file(str(i))
try:
unknowEncoding = face_recognition.face_encodings(imageUnknow)
unknowEncoded.append(unknowEncoding)
except IndexError:
print("I wasn't able to locate any faces in at least one of the images. Check the image files. Aborting...")
quit()
print("unLoad" + str(t))
return unknowEncoded
Возможно, пока что это макет, поэтому внутрь не смотрю.
Да и хотелось бы научиться пользоваться многопоточностью.
Пока что не получается =(
Вот такой код получился
import os
import face_recognition
from concurrent.futures import ThreadPoolExecutor
from PIL import ImageFile
class start:
ImageFile.LOAD_TRUNCATED_IMAGES = True
def convertEncoding(lookPhoto):
imageUnknow = face_recognition.load_image_file(lookPhoto)
try:
return face_recognition.face_encodings(imageUnknow)
except IndexError:
print("I wasn't able to locate any faces in at least one of the images. Check the image files. Aborting...")
quit()
def test(listing):
return listing
def loadDirPhotos():
pdir = "D:\ML\Face_regonition\inputpic"
lookPhotos = []
for d, dirs, files in os.walk(pdir):
for f in files:
path = "inputpic/" + f
lookPhotos.append(path)
return lookPhotos
with ThreadPoolExecutor() as pool:
result = [ pool.submit(convertEncoding, photo) for photo in loadDirPhotos()]
Он не хочет запускаться
вываливается со следующей ошибкой
n [45]: runfile('D:/ML/Face_regonition/start.py', wdir='D:/ML/Face_regonition')
Traceback (most recent call last):
File "<ipython-input-45-70bc3616bf8c>", line 1, in <module>
runfile('D:/ML/Face_regonition/start.py', wdir='D:/ML/Face_regonition')
File "C:\ProgramData\Anaconda3\envs\dlib\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\ProgramData\Anaconda3\envs\dlib\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "D:/ML/Face_regonition/start.py", line 8, in <module>
class start:
File "D:/ML/Face_regonition/start.py", line 42, in start
result = [ pool.submit(convertEncoding, photo) for photo in loadDirPhotos()]
File "D:/ML/Face_regonition/start.py", line 42, in <listcomp>
result = [ pool.submit(convertEncoding, photo) for photo in loadDirPhotos()]
NameError: name 'convertEncoding' is not defined