Вызов Python из .NET в цикле слишком медленный

1

У нас есть несколько библиотек python, которые нужно вызывать изнутри некоторых циклов в .NET, которые слишком медленны. Мы используем Process.Start, который занимает около 1/3 секунды за звонок, а это означает, что для запуска нескольких диалоговых окон требуется 30 секунд (на 8-ядерном компьютере - у наших клиентов, скорее всего, будут гораздо более медленные компьютеры).

По разным причинам мы не можем использовать IronPython (например, некоторые из файлов с помощью модуля csv, который знал проблемы с IronPython).

Что я могу сделать, чтобы ускорить процесс? Несмотря на то что я новичок python, некоторые из этих функций являются простыми блоками if elif else, а некоторые профилировки показывают, что основная "стоимость" начинается с python.exe несколько десятков раз. Есть ли какие-то секретные опции для запуска одного процесса python и потокового вещания?

Аналогичный вопрос этот.

  • 0
    Не могли бы вы запустить сценарии параллельно?
  • 0
    Есть еще один вариант синтаксического анализа CSV с IronPython: используйте TextFieldParser. Это один из самых полных анализаторов CSV, и он уже установлен в .NET. msdn.microsoft.com/en-us/library/...
Показать ещё 1 комментарий
Теги:
performance

3 ответа

2
Лучший ответ

Вы можете переписать свои сценарии, чтобы принимать команды со стандартного ввода и не выходить, когда они закончены.

Затем запустите процесс (или их пул) и подайте им команды вместо запуска новых процессов. Например, вместо создания нового some_script.py args1, some_script.py args2,... только spawn some_script_wrapper.py и подайте его:

args1
args2
\end

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

Конечно, вам нужно будет убедиться, что вход/выход обрабатывается полностью между частями данных. Чтобы было проще, вы можете обернуть свои аргументы/вывод в известный структурированный формат (json?), Убедитесь, что вы знаете "размер сообщения" или даже просто используете магические маркеры, чтобы узнать, когда вы получите конец блока данных.

  • 0
    Да, главным убийцей в этой ситуации является собственное время запуска Python, которое нетривиально. К сожалению, не существует волшебной техники предвидения "Питон как услуга".
  • 0
    Вероятно, мне придется это сделать, хотя я не контролирую библиотеку python и не знаю, как это сделать. Я читаю Dive Into Python прямо сейчас, и то, что они описывают, очень похоже на код в офисе - Dive Into Python - это стандартное руководство по Python в офисе, и я новичок в этом.
1

Вы можете попытаться встроить 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.

1

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

Можно вызвать буферизацию предложения, хотя это может быть невозможно в зависимости от того, что вы на самом деле делаете.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню