2

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

直到我们最近开始在 C# UI 中使用此代码(通过 IronPython 从 C# 运行此 Python 代码)之前,运行时间都不是问题。我提取了一组函数调用(按照第 1 段所述执行操作),发现与 Python 2.7 相比,此代码在 IronPython 中运行的时间大约是 Python 2.7 的 4 倍(这是在排除 C#/IronPython 中的启动/设置时间之后) . 我在来自 C# 的重复 IronPython 调用周围使用 C# 秒表,并在 Python 2.7 中的 execfile 周围使用 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]))
4

1 回答 1

4

你在使用 NUMPY 吗?!你很幸运,它完全可以在 IronPython 中运行!就在我们说话的时候,我们正在逐字添加支持!

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

更新:

您显然正在使用的 Enthought 的 IronPython 端口的Scipy看起来已被废弃:链接的 repos 中的最后一次提交已经有几年历史了,它也从http://www.scipy.org/install.html中丢失了。从文章来看,它是一个部分端口,带有.NET 中的接口和 C 中的核心与自定义接口链接。上一段也代表它。

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

于 2014-11-10T22:15:06.733 回答