0

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

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

目前大约需要 100-400 毫秒,这是一个相当慢的排序。想法?

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

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

您可以尝试对其进行分析,但与排序相比,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 回答