在python中对最小列表进行排序的最快方法

时间:2014-04-30 02:17:36

标签: python sorting

我有很多非常小的列表,我需要尽快排序。通常这些列表中有2-3个值,内置排序方法似乎有太多的开销。在这种情况下,一个简单的冒泡排序会好吗?

示例,想要排序:

[1, 5]
[4, 2]
[3, 7]
...

要:

[1, 5]
[2, 4]
[3, 7]
...

现在我正在做这样的事情:

def do_something( ilist ):
    ilist = sorted(ilist, reverse = True);
    return ilist;

for i in range(1000000000):
    do_something( [random_num,random_num ] );

感谢。

4 个答案:

答案 0 :(得分:2)

是。 如果列表列表总是2个元素。使用>运算符比使用sorted更快。

[(i[1], i[0]) if i[0]>i[1] else i for i in lst]

时间:

lst = [(0, 9),
       (1, 8),
       (2, 7),
       (3, 6),
       (4, 5),
       (5, 4),
       (6, 3),
       (7, 2),
       (8, 1),
       (9, 0)]

%timeit [(i[1], i[0]) if i[0]>i[1] else i for i in lst]
1000000 loops, best of 3: 1.96 us per loop

%timeit [sorted(i) for i in lst]
100000 loops, best of 3: 5.87 us per loop

在您的情况下,您说您的列表有2或3个元素。所以你的排序函数看起来像这样。

def sort_few(lst):
    if len(lst)==2:
        if lst[0] > lst[1]:
            return (lst[1], lst[0])
        else:
            return lst
    else:
        if lst[0] > lst[1]:
            if lst[1] > lst[2]:
                return (lst[2], lst[1], lst[0])
            else:
                return (lst[1], lst[2], lst[0])
        elif lst[1] > lst[2]:
            if lst[2] > lst[0]:
                return (lst[0], lst[2], lst[1])
            else:
                return (lst[2], lst[0], lst[1])
        elif lst[2] > lst[0]:
            if lst[0] > lst[1]:
                return (lst[1], lst[0], lst[2])
            else:
                return lst

时间:

lst = [(1, 2, 3),
       (1, 3, 2),
       (2, 1, 3),
       (2, 3, 1),
       (3, 1, 2),
       (3, 2, 1),
       (1, 2, 3),
       (1, 3, 2),
       (2, 1, 3),
       (2, 3, 1),
       (3, 1, 2),
       (3, 2, 1)]


%timeit [sort_few(i) for i in lst]
100000 loops, best of 3: 6.3 us per loop

%timeit [sorted(i) for i in lst]
100000 loops, best of 3: 7.32 us per loop

如果列表中有2个或3个元素,使用sort_fewsorted更快。

答案 1 :(得分:0)

使用sorted()非常有效:

>>> list_of_lists = [[1, 5], [4, 2], [3, 7]]
>>> sorted_lol = [sorted(sub_list) for sub_list in list_of_lists]
>>> sorted_lol
[[1, 5], [2, 4], [3, 7]]

答案 2 :(得分:0)

values = [{1, 5},{4, 2},{3, 7}]
print(sorted(values))

结果:

[set([1, 5]), set([2, 4]), set([3, 7])]

答案 3 :(得分:0)

如果它只有两个要素:

f = lambda x: x if x[0] < x[1] else [x[1],x[0]]

然后

x = [5,4]
f(x)

这将返回&#39; [4,5]&#39;

x = [4,5]
f(x)

还返回[4,5]

如果它不止两个,这不起作用,虽然你可以使用特殊情况3.这只是进行比较和交换,而不是调用完整的排序函数。