2011-12-23 5 views
2

나는 3 차원 포인트 클래스를 가지고 있는데,이 클래스의 해시 함수는 프로파일 러에 따라 최적화를 수행하기에 좋은 장소입니다. 지금 좌표의 튜플을 내장 해시 함수에 전달하는 것입니다.3D 포인트 해시 함수 최적화

def __hash__(self): 
     return hash((self.x, self.y, self.z)) 

어떻게하면 더 빠르게 만들 수 있습니까? 매번 튜플을 생성하는 것이 좋지 않다고 가정합니다. 좌표는 실수입니다.

답변

5

자신의 클래스 대신 튜플을 사용하는 것이 훨씬 빠릅니다.

p [0] 대신 p.x를 쓰고 싶다면 클래스를 튜플의 하위 클래스로 만들고 접근자를 만들 수 있습니다. 그것은 당신 자신의 튜플을 구현하는 것보다 훨씬 더 빠를 것이다.

class Point3d(tuple): 
    @property 
    def x(self): 
     return self[0] 

    @property 
    def y(self): 
     return self[1] 

    @property 
    def z(self): 
     return self[2] 
+0

CPython을 사용하여 임의의 테스트를 수행했습니다. 이와 같이 미리 생성 된 터플을 사용하여 내 해싱 시간을 절반으로 줄였습니다. 비트 시프트는 거의 두 배가되었습니다. – lunixbochs

+0

명명 된 튜플보다 왜 더 좋은가? –

+0

나는 그것이 아니라고 생각하며, 나는 당신의 답을 upvoted. –

1

자신의 클래스 대신 named tuple을 사용해보세요.