0

Python の専門家ではありません。この並べ替えをより迅速に実装しようとしています。現在、オブジェクトを含むハッシュがあり、それらのオブジェクトのメソッドへの呼び出しでそれらを並べ替えています。sorted() がどのように機能しているかはわかりません-これは比較ごとに複数のメソッド呼び出しを行っていますか? おそらく、メソッド呼び出しをハッシュ自体に保存し、それをソートした方がよいでしょうか?

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

現在、かなり遅いソートである ~100 ~ 400 ミリ秒かかります。考え?

メソッド呼び出しがここにあることに応答します。私はそれが方法であることに懐疑的です。これは 0.2 ミリ秒で実行される私の Ruby 実装の直接ポートですが、何らかの理由で Python では遅いかもしれません。実にシンプルな方法ですが。以下のトラック品質メソッドを呼び出しています。

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()

参考までに、Ruby ソースと同じものを実装しているように見えます。

self.sort_by { |track| track.quality }

私の推測では、ボンネットの下で何が起こっているかについては間違っています。

4

2 に答える 2

2

いいえ、アイテムごとにメソッドを 1 回呼び出すだけです。deprecatedcmp=は比較ごとに呼び出されます。

プロファイリングを試すこともできますが、ほとんどの場合、method_call はソートと比較して CPU を占有しています。

おそらく、コードを投稿して、method_call_here改善できるかどうかを確認できます。

于 2013-07-30T07:13:25.580 に答える
0

track_numberが変更されない場合は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
于 2013-07-30T07:58:29.260 に答える