1

在尝试导入和使用 SymPy 时,我在 VS2010 中遇到了 IronPython 的一些性能问题。

我有一个 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...

但是,如果我通过“Debug > Start without Debugging”运行程序,我会得到大约:

StandaloneIronPython
Import time = 2.199600
Basic numerics time= 0.015602
SymPy time = 0.140404
Press enter to continue...

我得到了大约 5 倍的导入速度和超过 10 倍的运行速度 sympy。

那么,如果 IronPython 一直在调试库代码,我如何才能获得良好的性能呢?

  • 有没有一种方法可以将 SymPy 捆绑为库、程序集或其他可以快速执行的东西?
  • 有没有办法告诉 VS2010 不要调试 SymPy 的代码?
  • 有没有其他类型的解决方案?
4

1 回答 1

0

每当您发现使用和未连接调试器运行之间存在很大的性能差异时,通常是因为您的应用程序正在生成大量调试器必须处理的事件。

最常见的例子是异常。如果 SymPy 在初始化期间抛出并捕获大量异常,则每个异常都会导致调试器往返(即使已处理),从而导致严重减速。

您可以通过转到“Debug > Exceptions...”、选中“Common Language Runtime Exceptions”旁边的“Thrown”框并重新运行应用程序来验证这一点。如果您在数百个异常处停下来,那就是您的问题。

如果这确实是您的问题,不幸的是,没有一个好的解决方法。将 Python 代码预编译成 .dll 不会阻止抛出这些异常。

于 2011-06-01T21:56:00.660 回答