У нас есть несколько библиотек python, которые нужно вызывать изнутри некоторых циклов в .NET, которые слишком медленны. Мы используем Process.Start, который занимает около 1/3 секунды за звонок, а это означает, что для запуска нескольких диалоговых окон требуется 30 секунд (на 8-ядерном компьютере - у наших клиентов, скорее всего, будут гораздо более медленные компьютеры).
По разным причинам мы не можем использовать IronPython (например, некоторые из файлов с помощью модуля csv, который знал проблемы с IronPython).
Что я могу сделать, чтобы ускорить процесс? Несмотря на то что я новичок python, некоторые из этих функций являются простыми блоками if elif else
, а некоторые профилировки показывают, что основная "стоимость" начинается с python.exe
несколько десятков раз. Есть ли какие-то секретные опции для запуска одного процесса python и потокового вещания?
Аналогичный вопрос этот.
Вы можете переписать свои сценарии, чтобы принимать команды со стандартного ввода и не выходить, когда они закончены.
Затем запустите процесс (или их пул) и подайте им команды вместо запуска новых процессов. Например, вместо создания нового some_script.py args1
, some_script.py args2
,... только spawn some_script_wrapper.py
и подайте его:
args1
args2
\end
Вы сохраните время запуска таким образом и сможете даже активировать многопроцессорность в пуле, если это необходимо.
Конечно, вам нужно будет убедиться, что вход/выход обрабатывается полностью между частями данных. Чтобы было проще, вы можете обернуть свои аргументы/вывод в известный структурированный формат (json?), Убедитесь, что вы знаете "размер сообщения" или даже просто используете магические маркеры, чтобы узнать, когда вы получите конец блока данных.
Вы можете попытаться встроить python в свое .NET-приложение с помощью pythonnet (http://pythonnet.sourceforge.net/readme.html#embedding), но, к сожалению, документации по этому вопросу практически нет.
Некоторые указатели http://mail.python.org/pipermail/pythondotnet/2007-June/000620.html и http://mail.python.org/pipermail/pythondotnet/2010-August/000994.html.
Не вызывайте функцию python в каждом цикле. Если вам нужно вызвать функцию 100 раз, измените эту функцию, чтобы принять 100 входов и вернуть 100 выходов. В .NET построить то, что я буду называть вашим пакетным запросом, отправить его в один огромный вызов функции, а затем перейти к тому, что еще нужно сделать.
Можно вызвать буферизацию предложения, хотя это может быть невозможно в зависимости от того, что вы на самом деле делаете.