为什么hash()在python3.4和python2.7下比较慢

时间:2016-10-19 16:37:45

标签: python python-3.4

我正在使用timeit进行一些性能评估,并发现python 2.7.10和python 3.4.3之间的性能降级。我把它缩小到hash()函数:

python 2.7.10:

>>> import timeit
>>> timeit.timeit('for x in xrange(100): hash(x)', number=100000)
0.4529099464416504
>>> timeit.timeit('hash(1000)')
0.044638872146606445

python 3.4.3:

>>> import timeit
>>> timeit.timeit('for x in range(100): hash(x)', number=100000)
0.6459149940637872
>>> timeit.timeit('hash(1000)')
0.07708719989750534

这是一个约。降低40%!整数,浮点数,字符串(unicodes或bytearrays)等是否被散列似乎并不重要;退化大致相同。在这两种情况下,哈希都返回64位整数。以上内容在我的Mac上运行,在Ubuntu盒子上有较小的降级(20%)。

我还在python2.7测试中使用PYTHONHASHSEED = random,在一些情况下,为每个“case”重新启动python,我看到hash()性能变差了一点,但绝不像python3.4那么慢

任何人都知道这里发生了什么?是否为python3选择了更安全但更慢的哈希函数?

1 个答案:

答案 0 :(得分:3)

Python 2.7和Python 3.4之间的hash()函数有两处变化

  1. SipHash
  2. 的采用
  3. 默认启用哈希随机化
  4. 参考文献: