更新日期:2009-05-29

感谢所有的建议和意见。我使用你的建议,使我的生产代码比几天前的最佳结果平均快2.5倍。最后我能够使java代码最快。

教训:

>我的下面的示例代码显示了原始int的插入,但是生产代码实际上是存储字符串(我的坏)。当我更正python执行时间从2.8秒到9.6。所以就在这个蝙蝠身上,java的存储实际上比较快。

>但它并不止于此。我一直在执行java程序如下:

java -Xmx1024m SpeedTest

但是如果您将初始堆大小设置如下,您将获得巨大的改进:

java -Xms1024m -Xmx1024m SpeedTest

这个简单的改变将执行时间减少了50%以上。所以我的SpeedTest的最终结果是python 9.6秒。 Java 6.5秒。

原始问题:

我有以下python代码:

import time
import sys
def main(args):
iterations = 10000000
counts = set()
startTime = time.time();
for i in range(0, iterations):
counts.add(i)
totalTime = time.time() - startTime
print 'total time =',totalTime
print len(counts)
if __name__ == "__main__":
main(sys.argv)

它在我的机器上执行了大约3.3秒,但是我想让它更快,所以我决定用java编程。我认为,因为java被编译,通常被认为比python更快,我会看到一些很大的回报。

这是java代码:

import java.util.*;
class SpeedTest
{
public static void main(String[] args)
{
long startTime;
long totalTime;
int iterations = 10000000;
HashSet counts = new HashSet((2*iterations), 0.75f);
startTime = System.currentTimeMillis();
for(int i=0; i
{
counts.add(i);
}
totalTime = System.currentTimeMillis() - startTime;
System.out.println("TOTAL TIME = "+( totalTime/1000f) );
System.out.println(counts.size());
}
}

所以这个java代码与python代码基本上是一样的。但是它执行在8.3秒而不是3.3。

我从一个现实世界的例子中提取了这个简单的例子来简化事情。关键的因素是我拥有(set或者hashSet),其结果与很多成员非常相似。

这是我的问题:

>我的python实现如何比我的java实现更快?

>有没有比hashSet(java)拥有更好的数据结构来容纳一个唯一的集合?

什么会使python实现更快?

>什么会使java实现更快?

更新:

感谢所有贡献的人迄今为止。请允许我添加一些细节。

我没有包括我的生产代码,因为它是相当复杂的。并会产生很多分心。我上面提到的情况是最简化的。这就意味着java put调用似乎比python set`s add()慢得多。

生产代码的java实现也比python版本慢2.5-3倍 – 就像上面那样。

我不关心vm预热或启动开销。我只想比较从startTime到我的totalTime的代码。请不要关心自己在其他事项。

我初始化了具有足够的桶的哈希集,所以它不应该重新打开。 (我将永远知道这个集合将最终包含多少个元素)。我想可以说我应该将它初始化为迭代/ 0.75。但是,如果你尝试它,你会看到执行时间没有明显的影响。

我为那些好奇的人设置了Xmx1024m(我的机器有4GB的RAM)。

我正在使用java版本:Java(TM)SE运行时环境(build 1.6.0_13-b03)。

在生产版本中,我正在hashSet中存储一个字符串(2-15个字符),所以我不能使用原语,尽管这是一个有趣的例子。

我已经运行代码很多次了。我非常有信心,python代码是Java代码的2.5到3倍之多。