【发布时间】:2011-12-27 04:46:29
【问题描述】:
我们正在 Python 中实现一些 kNN 和 SVD。其他人选择了 Java。我们的执行时间非常不同。我使用 cProfile 来查看我在哪里犯了错误,但实际上一切都很好fine。是的,我也使用numpy。但我想问一个简单的问题。
total = 0.0
for i in range(9999): # xrange is slower according
for j in range(1, 9999): #to my test but more memory-friendly.
total += (i / j)
print total
这个 sn-p 在我的电脑上需要 31.40 秒。
此代码的 Java 版本在同一台计算机上花费 1 秒或更短的时间。我想,类型检查是这段代码的主要问题。但是我应该为我的项目做很多这样的操作,我认为 9999*9999 并不是那么大的数字。
我认为我犯了错误,因为我知道 Python 被许多科学项目使用。但是为什么这段代码这么慢,我该如何处理比这更大的问题呢?
我应该使用诸如Psyco之类的JIT编译器吗?
编辑
我还说这个循环问题只是一个例子。代码不像这样简单,您的改进/代码示例可能很难付诸实践。
另一个问题是,如果我正确使用 numpy 和 scipy,我可以实现大量数据挖掘和机器学习算法吗?
【问题讨论】:
-
您还可以使用 Boost::Python 等工具在 C 或 C++ 中实现部分代码
-
@FabioDiniz 谢谢,我考虑了。 +1
-
任何解释型语言都将比编译型语言(如 Java)慢 1-2 个数量级。使它流行的是性能以外的因素。您并不总是需要高性能。如果你这样做了,但你也想要 python,你需要学习 C。
-
尽管这是一个旧线程,但我发现我自己看了十几次.. 我不得不把它放到测试台上.. 现在使用 PyPy 1.9 这需要
350 milliseconds我的电脑很普通。 Python 2.7 需要8 seconds。当然,通过将代码放入函数中可以达到这种速度,因为这总是可以加快 python 中的速度。我还使用了from __future__ import division,因为它快得多。
标签: python performance jit