为什么Java Hashmap比Python的字典慢很多?
如果你按照题主给的Java和Python代码,以及常用环境下的默认配置运行测试,你真的会发现Python版本比Java版本快。这自然是Java性能的一个坑——从来没有什么理论认为“理论上Java应该比Python快”,但在了解常见性能坑和最佳实践的前提下,纯Java程序在大规模运算中可能比纯Python程序有更好的性能,并且相对更具可扩展性。
另一方面,这个例子让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慢,至少不是这个例子性能差异的原因。