更快的Python排序实现

时间:2013-07-30 07:12:26

标签: python

不是Python人 - 试图更快地实现这种排序。目前我有一个包含对象的哈希,我在对这些对象的方法调用时对它们进行排序。我不确定sorted()是如何运作的 - 这是每次比较多个方法调用吗?我可能会更好地将方法调用存储在哈希本身并对其进行排序吗?

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

目前服用~100-400ms这是一个相当慢的类型。思考?

响应方法调用的内容;我怀疑这是方法。它是我的Ruby实现的直接端口,运行时间为0.2ms,但由于某种原因,它可能在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 }

我的猜测是我对引擎盖下发生的事情的看法不对。

2 个答案:

答案 0 :(得分:2)

不,它只是每个项目调用一次方法。每次比较都会调用已弃用的cmp=

您可以尝试对其进行分析,但很可能method_call是与排序相比的cpu hog。

也许您可以发布method_call_here的代码,看看是否可以改进。

答案 1 :(得分: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