2013-07-30 5 views
0

파이썬 사람이 아닙니다.이 정렬을 더 빠르게 구현하려고합니다. 현재 개체를 포함하는 해시가 있으며 이러한 개체의 메서드 호출에 따라 정렬됩니다. 나는 sorted()가 어떻게 작동하는지에 대해서는 확신하지 못한다. 이것은 비교마다 여러 개의 메소드를 호출하는 것인가? 아마도 해시 자체에 메서드 호출을 저장하고이를 정렬하는 것이 더 낫지는 않습니까?빠른 파이썬 정렬 구현

sorted(hash_object.items(), key=lambda x:x[1].method_call_here()) 

현재 약 100-400ms가 걸리는데 이는 상당히 느린 정렬입니다. 생각?

메서드 호출의 응답은 여기에 있습니다. 나는 그것이 방법이라는 것에 회의적이다. 0.2ms로 실행되는 내 Ruby 구현의 직접 포트이지만, 파이썬에서는 어떤 이유로 느려질 수 있습니다. 정말 간단한 방법. 그것은 아래의 트랙 품질 메소드를 호출하는 것 :

self.sort_by { |track| track.quality } 

내 생각 엔 내가 무엇을 아래에서 무슨 일이 일어나고에 대한 틀렸다 : 그것은 루비 소스와 동일 뭔가를 구현하는 것처럼

참고로
class Track: 

    def __init__(self, title, play_count, track_number): 
    self.title = title 
    self.play_count = play_count 
    self.track_number = track_number 

    def predicted_listens(self): 
    return 1/self.track_number 

    def track_quality(self): 
    return self.play_count/self.predicted_listens() 

, 그것은 보인다 후드.

+0

소리가 잘 들리지 않습니다. 루비 정렬은 500 배 빠릅니다. 대략 얼마나 많은 품목에 대해서 이야기하고 있습니까? –

+0

이 Python2는 Python3입니까? 'self.track_number'가 Python2에서'int' 인 경우'1/self.track_number'가 잘립니다. –

+0

이 오래된 컴퓨터에서는 100,000 개 항목을 정렬하는 데 약 148ms가 걸렸습니다. 그게 바로 볼 파크에 있니? –

답변

2

아니요. 항목 당 한 번만 메소드를 호출합니다. 사용되지 않는 cmp=은 각 비교에 대해 호출됩니다.

프로파일 링을 시도해 볼 수는 있지만 대부분 method_call은 정렬과 비교하여 CPU 호그입니다.

method_call_here 코드를 게시하여 개선 될 수 있는지 확인하는 것이 좋습니다. track_number 변경하지 않을 경우

+0

메서드 호출로 편집; 빠른 피드백을 주셔서 감사합니다 :) –

0

, 그것은 predicted_listens 클래스 멤버를 만들고 정렬하는 동안 그것을 계산 피하기 위해 __init__ 함수의 값을 설정 (그리고 다른 곳에서는 그것을 변경) 가치가있을 수도 있습니다. 이렇게하면 정렬 성능이 향상 될 수 있습니다.

def __init__(self, title, play_count, track_number): 
    self.title = title 
    self.play_count = play_count 
    self.track_number = track_number 
    self.predicted_listens = 1/self.track_number 
+0

그 점에서 track_quality는 메소드 일 필요는 없지만'__init__'에서도 계산할 수 있습니다. – PaulMcG