不是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 }
我的猜测是我对引擎盖下发生的事情的看法不对。
答案 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