我在
例如:
abc是一个具有属性id和count的类。
我有一个abc类的列表对象。
list=[abc('1',120),abc('2',0),abc('0',180),abc('5',150)].
我想按属性的递增顺序对列表进行排序' count'
我用它完成了:
list.sort(key=attrgetter('count'))
我发现使用我的python脚本分析需要大量的时间进行排序。
根据最小化排序时间的属性,任何人都可以建议更好,更强大的方式对对象列表进行排序。
答案 0 :(得分:1)
我相信sort
方法是使用Timsort算法实现的,因此在排序方面没有太多可以改进的方法。
如果您可以控制代码的插入部分,则可以执行的操作是以不同方式插入元素
例如,您可以使用binary heap来优化最大元素的retreiving(请参阅Python中的heapq
模块)或binary search tree以维护排序顺序。
您选择的数据结构主要取决于您想要对元素做什么。
答案 1 :(得分:1)
挑剔:您使用名称list
作为列表,这将覆盖标准list
类。您最好使用l
作为列表名称。
我测试了一个包含12次列表内容12倍的列表。当我使用sorted()函数避免重新排序已排序的列表时,没有比较器函数或密钥需要0.848秒。
我至少有三种方法可以想到:
一个。将sort()与比较器函数一起使用:
def comparator(x, y):
return cmp(x.count, y.count)
l.sort(cmp=comparator)
当我使用sorted()函数避免重新排序已经排序的列表时,我的系统花了9.598秒。
B中。使用带键功能的sort():
l.sort(key=operator.attrgetter('count'))
当我使用sorted()函数避免重新排序已经排序的列表时,我的系统需要3.111秒。
℃。使用本机C代码来提高排序性能。我没有测试过这个。
因此,您似乎已经在使用最快的全Python方式,而前进的方向是使用本机C代码。
答案 2 :(得分:0)
如果我理解正确的话:
class Abc(object):
def __init__(self, name, count):
self.name = name
self.count = count
@classmethod
def sort_key(cls, key):
if key == 'count':
return lambda obj: obj.count
elif key == 'name':
return lambda obj: obj.name
lst = [Abc('1', 120), Abc('2', 0), Abc('0', 180), Abc('5', 150)]
lst.sort(key=Abc.sort_key('count'))
for e in lst:
print e.name, e.count
print
lst.sort(key=Abc.sort_key('name'))
for e in lst:
print e.name, e.count
print
我不建议您使用' id',' abc'和'列出'作为任意变量的名称,因为它们是python中的关键字。