2016-10-19 2 views
4

timeit을 사용하여 성능 평가를하고 있었고 python 2.7.10과 python 3.4.3 간의 성능 저하를 발견했습니다. 나는 hash() 기능으로 좁혀 :왜 python3.4와 python2.7에서 hash()가 더 느립니다.

파이썬 2.7.10 :

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

파이썬 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 % 분해! 정수, 수레, 문자열 (유니 코드 또는 바이트 타래) 등이 해싱되면 문제가되지 않습니다. 저하는 거의 같습니다. 두 경우 모두 해시가 64 비트 정수를 반환합니다. 위의 내용은 Mac에서 실행되었으며 우분투 상자에서는 20 % 정도의 성능 저하가 발생했습니다.

나는 각 "사건"에 대한 파이썬을 다시 시작, 일부가지 경우 python2.7 시험과 에서 임의 PYTHONHASHSEED을 = 사용했습니다, 나는 hash() 성능이 조금 더 있지만, python3로 결코 느린 얻을 보았다. 4

여기에 무슨 일이 일어나는 지 아는 사람이 있습니까? 파이썬 3에서보다 안전하지만 느린 해쉬 함수가 선택 되었습니까?

+0

해시 함수는 확실히 안전하지 않습니다. 암호화 해시를위한 것이 아닙니다. 주요 목적은'dict'과'set'을 위해 사용되는 것입니다. –

+0

스벤 : 이해합니다. 첫 번째 단락을 읽으십시오. 암호 용도로 사용하지 않습니다. 사실, 나는 hash()를 전혀 사용하지 않지만, python3.4에서 somedict [someindex]가 파이썬 2.7보다 느린 이유의 근본적인 원인입니다. –

+1

그들은 파이썬 3.4에서 SipHash로 전환했습니다. 일부 데이터에서 FNV보다 느립니다. https://bugs.python.org/issue14621 – vaultah

답변

관련 문제