更快速地根据Python中的属性对对象列表进行排序

时间:2015-03-23 07:32:23

标签: python list python-2.7 sorting

我在 中有一个对象列表,我希望根据属性进行排序

例如:

abc是一个具有属性id和count的类。

我有一个abc类的列表对象。

list=[abc('1',120),abc('2',0),abc('0',180),abc('5',150)].

我想按属性的递增顺序对列表进行排序' count'

我用它完成了:

list.sort(key=attrgetter('count'))

我发现使用我的python脚本分析需要大量的时间进行排序

根据最小化排序时间的属性,任何人都可以建议更好,更强大的方式对对象列表进行排序。

3 个答案:

答案 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中的关键字。