我正在研究算法,并决定将Java程序从教科书移植到Python,因为我不喜欢Java的开销,特别是对于小程序来说,这是一种练习。在
算法本身非常简单,它只是以一种蛮力的方式从数组中取出所有的三元组,然后计算三元组中有多少个相加为零(例如:[-2,7,-5])public static int count(int[] a) {
int N = a.length;
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = i+1; j < N; j++) {
for (int k = j+1; k < N; k++) {
if (a[i] + a[j] + a[k] == 0) {
cnt++;
}
}
}
}
return cnt;
}
我把它移植到:
^{pr2}$
现在测量这些函数需要:java : array of 2000 elements --> 3 seconds
python : array of 2000 elements --> 2 minutes, 19 seconds
UPDATE
python (pypy) : array of 2000 elements --> 4 seconds ( :-) )
当然,这并不是一个好的算法,它只是在这里和教科书中说明。我以前用Java和Python都做过一些编程,但是没有意识到这种巨大的差异。在
问题归结为:如何克服这个问题?更具体地说:这段代码是一个好的端口,还是我遗漏了一些琐碎的东西?在
例如,切换到另一个运行时Jython是一个解决方案吗?在eclipse中保存我的代码库并添加一个解释器(编译器)容易吗?或者换成另一个解释器/编译器只会让事情稍微好一点吗?在
现在我在Windows7上使用Python2.7.3和Java1.72ibts。在
我知道在java/python性能方面也有类似的问题,但是对于python来说,有不同的运行环境这样的答案目前对我没有帮助。在
我想知道的是,这些运行时中的一些是否可以弥补这个巨大的差距,是否值得epxlore?在
更新:
我安装了pypy,现在差别很大。。。在
更新2:
我注意到一些非常有趣的事情:这里答案中的islice方法在“常规”python上更快,但在pypy上慢得多。即使如此,pypy在该算法中使用常规循环或islice,仍然保持了更快的速度
正如Bakuriu在一篇评论中所指出的,运行时环境可以起到很大的作用,但是对于这种算法来说,运行时环境更快并不一定对任何算法更快。。。在