Использование модуля потоковой обработки Python для вызова функции ctypes быстрее, чем при использовании многопроцессорной обработки?

#python #multithreading #multiprocessing

#python #многопоточность #многопроцессорная обработка

Вопрос:

Я ни за что на свете не смог бы найти ответ на эту проблему.

Я написал скрипт, который выполняет сотни тяжелых вычислений. У меня есть блестящая идея записать эти вычислительные задачи на C , а затем использовать ctypes Python для взаимодействия с ними.

Я подумал про себя, что мог бы даже оптимизировать это дальше, используя параллелизм. Мой первоначальный подход заключается в использовании многопоточности. И тогда я понял, что мои задачи привязаны к процессору. Поэтому имеет смысл только то, что вместо этого мы используем многопроцессорную обработку. Что ж, оказывается, что модуль многопроцессорной обработки значительно медленнее, чем потоковая обработка, вероятно, из-за накладных расходов.

И тогда я наткнулся на это. Для тех, кто не хочет переходить по отрывочной ссылке, оказывается, что модуль ctypes обходит GIL. Это означает, что моя попытка многопоточности в Python может обеспечить истинный параллелизм.

Итак, мой вопрос: есть ли где-нибудь в официальной документации упоминание о ctypes и GIL?

Я прикрепил код, который я использую для тестирования потоков ctypes и многопроцессорной обработки.

 # Method 1: Using threading
start = time()

threads = []
for arg in args:
    threads.append(threading.Thread(target=some_ctypes_func, args=(arg, )))

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

print(f"Elapsed time: {time() - start}")

# Method 2: Using multiprocessing
results = []
with Pool(8) as p:
    start = time()
    for arg in args:
        result = p.apply_async(some_ctypes_func, args=(arg,))
        results.append(result)

    results = [result.get() for result in results]
    print(f"Elapsed time: {time() - start}")
  

Используя приведенный выше код, модуль потоковой обработки примерно в 2-3 раза быстрее, чем многопроцессорная обработка.

Комментарии:

1. Если у вас уже есть функция на C или любом другом родном языке, какой смысл использовать python только для выполнения этих потоков? Не лучше ли реализовать также многопоточность на C ?

2. @OlvinRoght Ну, одна функция завершила свое выполнение менее чем за секунду. Выполнение этой функции с разными входными данными в сотни раз более трудоемко. Кроме того, Python предоставляет приятный высокоуровневый интерфейс для многопоточности, что приятно.

3. Я просто хочу указать вам, что если вы реализуете простую многопоточность на C и функцию экспорта, которая выполняет всю работу и возвращает результаты, это будет намного быстрее. Кстати, есть много способов реализовать многопоточность на C с помощью пары строк кода, не большая разница с python