Как ускорить вычисления в Python с помощью
Когда речь заходит о ресурсоемких задачах, которые нагружают ваш CPU, стоит обратить внимание на библиотеку
Вот простой пример:
📲 Мы в MAX
👉@BookPython
multiprocessing.PoolКогда речь заходит о ресурсоемких задачах, которые нагружают ваш CPU, стоит обратить внимание на библиотеку
multiprocessing, а именно на класс Pool. Он позволяет задействовать все доступные ядра процессора, автоматически распределяя задачи между ними. Вот простой пример:
import math
from multiprocessing import Pool
# Генерируем список входных данных
inputs = [i ** 2 for i in range(100, 130)]
# Функция для вычислений
def f(x):
return len(str(math.factorial(x)))
# Последовательное выполнение
%timeit [f(x) for x in inputs]
# Результат: ~1.44 сек
# Параллельное выполнение
p = Pool(4) # Создаем пул из 4 процессов
%timeit p.map(f, inputs)
# Результат: ~451 мс
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
Модуль
Модуль
Это означает, что потоки полезны в основном в случаях, когда программа выполняет операции, не связанные с Python-интерпретатором, например, ожидание ввода-вывода (IO). К примеру, загрузка трёх различных статей из Википедии будет одинаково эффективной как с потоками, так и с процессами. Причём результат в три раза быстрее по сравнению с выполнением задачи в одном процессе:
Однако использование потоков для задач, нагружающих CPU, практически бессмысленно:
При задачах, требующих интенсивных вычислений, использование процессов вместо потоков даст значительный прирост производительности благодаря распределению нагрузки между несколькими ядрами процессора.
📲 Мы в MAX
👉@BookPython
multiprocessing в Python: потоки против процессовМодуль
multiprocessing позволяет создавать не только процессы, но и потоки. Однако стоит помнить о главной особенности CPython — GIL (Global Interpreter Lock). Этот механизм блокирует выполнение байт-кода Python несколькими потоками одновременно. Это означает, что потоки полезны в основном в случаях, когда программа выполняет операции, не связанные с Python-интерпретатором, например, ожидание ввода-вывода (IO). К примеру, загрузка трёх различных статей из Википедии будет одинаково эффективной как с потоками, так и с процессами. Причём результат в три раза быстрее по сравнению с выполнением задачи в одном процессе:
from multiprocessing import Pool
from multiprocessing.pool import ThreadPool
import requests
def download_wiki_article(article):
url = 'https://de.wikipedia.org/wiki/'
return requests.get(url + article)
process_pool = Pool(3)
thread_pool = ThreadPool(3)
thread_pool.map(download_wiki_article, ['a', 'b', 'c'])
# ~376 ms
process_pool.map(download_wiki_article, ['a', 'b', 'c'])
# ~373 ms
[download_wiki_article(a) for a in ['a', 'b', 'c']]
# ~1.09 s
Однако использование потоков для задач, нагружающих CPU, практически бессмысленно:
import math
from multiprocessing import Pool
from multiprocessing.pool import ThreadPool
def f(x):
return len(str(math.factorial(x)))
process_pool = Pool(4)
thread_pool = ThreadPool(4)
inputs = [i ** 2 for i in range(100, 130)]
[f(x) for x in inputs]
# ~1.48 s
thread_pool.map(f, inputs)
# ~1.48 s
process_pool.map(f, inputs)
# ~478 ms
При задачах, требующих интенсивных вычислений, использование процессов вместо потоков даст значительный прирост производительности благодаря распределению нагрузки между несколькими ядрами процессора.
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3