更新日期: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倍之多。