我正在使用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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
那是一个约.降低40%!整数,浮点数,字符串(unicodes或bytearrays)等是否被散列似乎并不重要; 退化大致相同.在这两种情况下,哈希都返回64位整数.以上是在我的Mac上运行,并在Ubuntu盒子上得到了较小的降级(20%).
我也使用PYTHONHASHSEED =随机进行python2.7测试,在某些情况下,为每个"case"重启python,我看到hash()性能有点差,但从未像python3.4那么慢
谁知道这里发生了什么?是否为python3选择了更安全但更慢的哈希函数?
hash()Python 2.7和Python 3.4在功能上有两个变化
参考:
object.__hash__本节最后一行)。指定PYTHONHASHSEED值 0 将禁用哈希随机化。