Низкая производительность IronPython для внешних модулей при включенной отладке
Я сталкиваюсь с некоторыми проблемами с производительностью IronPython внутри VS2010 при попытке импортировать и использовать SymPy.
У меня есть тестовый проект IronPython, содержащий следующий код:
import time
print 'StandaloneIronPython'
startTime = time.time()
from sympy import *
importTime = time.time() - startTime
print 'Import time = %f' % importTime
startTime = time.time()
for x in (x/10.0 for x in xrange(-100,100)):
(x**2-2*x)
numericsTime = time.time() - startTime
print 'Basic numerics time= %f' % numericsTime
startTime = time.time()
for x in (x/10.0 for x in xrange(-100,100)):
N(x**2-2*x)
sympyTime = time.time() - startTime
print 'SymPy time = %f' % sympyTime
raw_input('Press enter to continue...')
SymPy был загружен и установлен как яйцо; моя папка "IronPython 2.7\Lib\site-packages" находится в пути поиска проекта.
Если я запускаю программу через "Отладка> Начать отладку", я получаю примерно следующее:
StandaloneIronPython
Import time = 12.090019
Basic numerics time= 0.015594
SymPy time = 2.230804
Press enter to continue...
Однако, если я запускаю программу через "Отладка> Запустить без отладки", я получаю примерно:
StandaloneIronPython
Import time = 2.199600
Basic numerics time= 0.015602
SymPy time = 0.140404
Press enter to continue...
Я получаю ~5-кратную скорость импорта и>10-кратную скорость работы.
Так как же получить хорошую производительность от IronPython, если он тратит все свое время на отладку кода библиотеки?
- Есть ли способ, которым я могу собрать SymPy в виде библиотеки, сборки или чего-то еще, чтобы он работал быстро?
- Есть ли способ сказать VS2010 не отлаживать код для SymPy?
- Есть ли какое-то другое решение?
1 ответ
Всякий раз, когда вы видите большое несоответствие производительности между запуском с отладчиком и без него, обычно это происходит потому, что ваше приложение генерирует массу событий, которые отладчик должен обработать.
Наиболее распространенным примером этого являются исключения. Если SymPy выбрасывает и перехватывает множество исключений во время инициализации, каждое исключение вызывает возврат в отладчик (даже если он обрабатывается), вызывая значительное замедление.
Вы можете проверить это, перейдя в "Отладка> Исключения...", установив флажок "Брошенный" рядом с "Общими исключениями времени выполнения языка" и повторно запустив приложение. Если вы остановитесь на сотнях исключений, это ваша проблема.
Если это действительно ваша проблема, к сожалению, нет хорошего обходного пути для этого. Предварительная компиляция кода Python в.dll не предотвратит появление этих исключений.