низкая производительность IronPython для внешних модулей при включенной отладке - PullRequest
1 голос
/ 31 мая 2011

Я сталкиваюсь с некоторыми проблемами с производительностью 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 Ответ

0 голосов
/ 02 июня 2011

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

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

Вы можете проверить это, перейдя в раздел «Отладка».> Исключения ... », установите флажок« Брошено »рядом с« Общими исключениями времени выполнения языка »и перезапустите приложение.Если вы остановитесь на сотнях исключений, у вас есть проблема.

Если это действительно ваша проблема, к сожалению, для нее нет хорошего обходного пути.Предварительная компиляция кода Python в .dll не предотвратит выброс этих исключений.

...