IronPython与Python的速度与numpy

时间:2014-11-10 21:01:06

标签: python .net numpy ironpython python.net

我有一些Python源代码可以处理数字列表列表(比如大约10,000个浮点数)并对这些数字进行各种计算,例如包括很多numpy.linalg.norm。

在我们最近开始从C#UI使用此代码(通过IronPython从C#运行此Python代码)之前,运行时间不是问题。我提取了一组函数调用(按照第1段中的描述进行操作),发现与Python 2.7相比,此代码在IronPython中运行的时间大约长4倍(这是在排除C#/ IronPython中的启动/设置时间之后) 。我正在使用C#秒表来绕过C#重复的IronPython调用,并在Python 2.7中使用exec文件周围的timeit模块(因此Python时间结果包括更多操作,如加载文件,创建对象,......而C#没有“T)。前者需要大约4.0秒,而后者需要大约0.9秒。

你会期待这种差异吗?我有什么想法可以解决这个问题?其他评论?


编辑:

这是一个简单的代码示例,在我的机器上运行IronPython大约慢10倍(在Python 2.7中为4秒,在IronPython中为40秒):

n = 700
for i in range(n-1):
    for j in range(i, n):
        dist = np.linalg.norm(np.array([i, i, i]) - np.array([j, j, j]))

1 个答案:

答案 0 :(得分:4)

你正在使用NUMPY吗?!你很幸运它在IronPython中有效! The support is being added literally as we speak!

确切地说,有一个CPython-extension-to-IronPython接口项目,并且有一个本机CLR端口或numpy。我不知道你正在使用哪一个,但两种方式都比使用CPython中的C版慢几个数量级。

更新:

你显然使用的Scipy for IronPython port by Enthought看起来已经被遗弃了:链接中的最后一次提交已经有几年了,http://www.scipy.org/install.html也没有。从文章来看,它是一个部分端口,在.NET中具有接口,在C中核心与自定义接口链接。前一段也代表它。

使用来自Faster alternatives to numpy.argmax/argmin which is slow的信息,如果限制在CLR和C核心之间来回传递数据,则可能会获得一些加速。