为什么Java的Hashmap比Python的dictionary慢得多
发布网友
发布时间:2022-04-20 20:36
我来回答
共2个回答
热心网友
时间:2022-04-18 04:52
如果按照题主给出的Java和Python代码,在常见环境里按照默认配置来跑测试,确实会发现Python版例子比Java版例子跑得快。这自然也算是Java性能的一个坑啦——从来就没有什么“理论上Java应该比Python快”的理论,而是在知道常见性能坑、知道best practice的前提下,纯Java程序在较大规模的运算上有可能比纯Python程序有更好的性能,并且相对来说更scalable。
话说回来,这个例子要让Java比Python跑得快无需修改代码,只要稍微修改一下Java的启动参数即可。另外我也相信这个小例子不一定充分反映了题主说的“需要3个小时以上”的那个Java程序的性能问题。那个程序或许也只需要稍微调整一下启动参数就可以大幅提高性能,也可能要修改代码去掉一些不好的做法。
所以具体到题主这个例子,是什么造成Java比Python慢得多?是HashMap写得没dict好?是因为HashMap用Java实现而dict用C实现?是因为JIT的预热开销?还是别的?
假定题主运行Java和Python的环境都是常见的,例如说Oracle JDK vs 原装CPython,那么在Java一侧讨论的对象就是Oracle JDK里的HotSpot VM的性能。
答案是:是因为题主没有设置好GC的参数,而HotSpot VM默认的GC参数在这个例子上非常不适用,导致默认参数下Java版的性能非常糟糕。Java的HashMap自身并不慢,特别是经过JIT编译后它其实不会比CPython的dict慢,至少不是造成这个例子的性能差异的原因。
热心网友
时间:2022-04-18 06:10
是的,从接口上和实现上,python的dict都算是一种hashmap。