擅长:python、mysql、java
<p>我怀疑Python使用整数值本身作为散列值,而基于散列表的set实现直接使用该值。根据<a href="http://svn.python.org/view/python/trunk/Objects/dictobject.c?revision=72958&view=markup" rel="nofollow noreferrer">source</a>中的注释:</p>
<blockquote>
<p>This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
the low-order i bits as the initial table index is extremely fast, and there
are no collisions at all for dicts indexed by a contiguous range of ints.
The same is approximately true when keys are "consecutive" strings. So this
gives better-than-random behavior in common cases, and that's very desirable.</p>
</blockquote>
<p>对于Python来说,这个microbenchmark是一个最好的例子,因为它会导致完全零散列冲突。然而,如果Javas HashSet要重新散列密钥,它必须执行额外的工作,并且在发生碰撞时会出现更糟糕的行为。在</p>
<p>如果你在一个范围内随机洗牌在循环之前,即使在循环之外完成随机播放和列表创建,运行时也要慢2倍多。在</p>