Почему лучше использовать синхронное программирование для операций в памяти?

Я сделал запрос для вас. Это даст вам рекурсивную категорию с одним запросом:

SELECT id,NAME,'' AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 WHERE prent is NULL
UNION 
SELECT b.id,a.name,b.name AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id WHERE a.prent is NULL AND b.name IS NOT NULL 
UNION 
SELECT c.id,a.name,b.name AS subName,c.name AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id WHERE a.prent is NULL AND c.name IS NOT NULL 
UNION 
SELECT d.id,a.name,b.name AS subName,c.name AS subsubName,d.name AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id LEFT JOIN Table1 AS d ON d.prent=c.id WHERE a.prent is NULL AND d.name IS NOT NULL 
ORDER BY NAME,subName,subsubName,subsubsubName

Вот скрипка .

2
задан paperduck 3 March 2019 в 08:25
поделиться

2 ответа

Ваша задача больше связана с процессором, чем с операциями ввода-вывода. Асинхронное выполнение имеет смысл, когда у вас длинные операции ввода-вывода, т.е. отправка / получение чего-либо из сети и т. Д.

То, что вы можете сделать, это разделить задачу на куски и использовать потоки и многопроцессорность (работать на разных ядрах процессора).

0
ответ дан istinspring 3 March 2019 в 08:25
поделиться

Это просто общий ответ, но слишком длинный для комментария ...

Прежде всего, я думаю, что вашим самым большим узким местом в данный момент является сам Python. Я не знаю, что делает do_work(), но если он интенсивно использует процессор, у вас есть GIL, который полностью предотвращает эффективное распараллеливание внутри одного процесса. Независимо от того, что вы делаете, потоки будут бороться за GIL, и это в конечном итоге сделает ваш код еще медленнее. Помните: Python имеет реальную многопоточность, но центральный процессор совместно используется внутри одного процесса. Я рекомендую проверить страницу Дэвида М Бизли: http://dabeaz.com/GIL/gilvis , который приложил много усилий для визуализации поведения GIL в Python.

С другой стороны, модуль multiprocessing позволяет запускать несколько процессов и «обходить» недостатки GIL, но будет сложно получить доступ к тем же ячейкам памяти без больших штрафов или компромиссов. [1110 ]

Второе: если вы используете тяжелые вложенные циклы, вам следует подумать об использовании numba и попытках разместить ваши структуры данных внутри numpy (структурированных) массивов. Это может дать вам порядок скорости довольно легко. Python слишком медленный для таких вещей, но, к счастью, есть способы выжать лот при использовании соответствующих библиотек.

Подводя итог, я думаю, что код, который вы запускаете, может быть на несколько порядков быстрее со структурами numba и numpy.

В качестве альтернативы, вы можете попробовать переписать код на языке, подобном Julia (синтаксис, очень похожий на Python и сообщество, чрезвычайно полезен) и быстро проверить, насколько быстро он работает, чтобы изучить ограничения производительности. Всегда полезно почувствовать, насколько быстро что-то (или части кода) может быть в языке, который не имеет таких сложных критических аспектов производительности, как Python.

0
ответ дан tamasgal 3 March 2019 в 08:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: