나는 평등에 대한 데이터의 큰 덩어리를 비교해야하고, 나는, 초당 많은 비교 빠른이 필요합니다. 모든 객체는 동일한 크기로 보장되며, 알 수없는 위치에서 약간 다를 수 있습니다.이것은 파이썬의 내장 해시 함수를 적절히 사용하고 있습니까?
아래 대화식 세션에서 ==
연산자를 사용하여 바이트 문자열에 대한 차이가 문자열 끝에 가까울수록 느려질 수 있으며 시작 부분에 차이가있을 경우 매우 빨라질 수 있습니다.
나는 일종의 해시를 사용하여 작업 속도를 향상시킬 수있는 방법이있을 것이라고 생각했다. 물론 md5 해시를 계산하고 비교하는 것은 공정한 딱딱한 속도이지만, 파이썬의 inbuilt 해시는 작업 속도를 크게 향상시키는 것처럼 보입니다.
그러나이 해시의 구현 세부 사항에 대해서는 전혀 알지 못하지만 실제로 해시와 비슷한 점이있어서 hash(a) == hash(b)
일 때 a == b
일 가능성이 높습니다. 해시 충돌이 파이썬의 해시 함수는 속도를 위해 설계되었습니다
In [1]: import hashlib
In [2]: with open('/dev/urandom') as f:
...: spam = f.read(2**20 - 1)
...:
In [3]: spamA = spam + 'A'
In [4]: Aspam = 'A' + spam
In [5]: spamB = spam + 'B'
In [6]: timeit spamA == spamB
1000 loops, best of 3: 1.59 ms per loop
In [7]: timeit spamA == Aspam
10000000 loops, best of 3: 66.4 ns per loop
In [8]: timeit hashlib.md5(spamA) == hashlib.md5(spamB)
100 loops, best of 3: 4.42 ms per loop
In [9]: timeit hashlib.md5(spamA) == hashlib.md5(Aspam)
100 loops, best of 3: 4.39 ms per loop
In [10]: timeit hash(spamA) == hash(spamB)
10000000 loops, best of 3: 157 ns per loop
In [11]: timeit hash(spamA) == hash(Aspam)
10000000 loops, best of 3: 160 ns per loop
해시 함수는 아키텍처에 따라 달라집니다. – JBernardo