优化函数以对元组列表进行排序

时间:2010-01-09 19:28:13

标签: python optimization sorting

我需要按降序排序第一项的元组列表,然后按升序排序第二项。

为此,我实现了以下功能,但我认为它可能更快。

>>> compare = lambda a, b: -cmp(b[1], a[1]) if b[0] == a[0] else cmp(b[0], a[0])
>>> sorted([(0, 2), (0, 1), (1, 0), (1, 2)], cmp=compare)
[(1, 0), (1, 2), (0, 1), (0, 2)]

是否可以对其进行优化?请参阅与内置函数的比较:

>>> timeit.Timer(stmt='sorted([(int(random.getrandbits(4)),int(random.getrandbits(4))) for x in xrange(10)], cmp=compare)', setup='import random; compare=compare = lambda a, b: -cmp(b[1], a[1]) if b[0] == a[0] else cmp(b[0], a[0])').timeit(100000)
4.0584850867917339
>>> timeit.Timer(stmt='sorted([(int(random.getrandbits(4)),int(random.getrandbits(4))) for x in xrange(10)])', setup='import random').timeit(100000)
2.6582965153393161

2 个答案:

答案 0 :(得分:8)

对我来说,使用密钥而不是比较功能要快一点,并且可以说更容易阅读:

sorted([(0, 2), (0, 1), (1, 0), (1, 2)], key = lambda x:(-x[0], x[1]))

这需要Python 2.4或更高版本。

答案 1 :(得分:0)

这对你有什么影响?

compare = lambda a, b: cmp(b[0], a[0]) and cmp(a[1],b[1])