簡體   English   中英

Python:從有序列表中對鍵的子列表進行排序的最快方法是什么

[英]python: what is the fastest way to sort a sublist of key from an ordered list

我對從一長串鍵中排序無序的鍵子列表的速度有疑問。 所以

keys =['a','c','b','f','e','d','p','t','s','y','h']
sub_list = ['y','b','a','p']

我有兩個想法:

sublist = sorted(sub_list, key=keys)

要么,

sublist = [key for key in keys if key in sub_list]

據我所知,可能有比這兩種更好的方法。 有什么想法嗎?

只是時間:

In [3]: %timeit sorted(sub_list, lambda a,b: cmp(keys.index(a), keys.index(b)))
100000 loops, best of 3: 6.22 us per loop

In [4]: %timeit sublist = [key for key in keys if key in sub_list]
1000000 loops, best of 3: 1.91 us per loop

編輯(更多方法)

%timeit sorted(sub_list, key=keys.index)
100000 loops, best of 3: 2.8 us per loop

本示例使用宏(或在ipython中調用的ipython ),但您可以通過以下方式自己使用timeit

import timeit

p = """
keys =['a','c','b','f','e','d','p','t','s','y','h']
sub_list = ['y','b','a','p']"""

s = "sorted(sub_list, lambda a,b: cmp(keys.index(a), keys.index(b)))"

timeit.Timer(stmt=s, setup=p).timeit()
>>> 8.40028386496742

s = "[key for key in keys if key in sub_list]"
timeit.Timer(stmt=s, setup=p).timeit()
>>> 1.9661344551401498

因此,您可以嘗試所有可以想到的方法並選擇最快的方法

為什么不只是sub_list.sort() 它可能不是最快的,但是很容易理解。

我認為您應該在sorted上使用sub_list.sort ,因為.sort進行就地排序,而sorted會在sorted之前復制子列表

您進行列表理解的速度非常慢,因為最后一個if語句必須掃描整個sub_list(因此,每個鍵要進行n次操作)

sublist = [key for key in keys if key in sub_list]

更快的列表理解將是這樣

sub_set = set(sublist)
sub_list = [key for key in keys if key in sub_set]

因為哈希和集合查找為O(1),列表查找為O(n)

排序通常為O(nlog(n)),列表理解為O(n)

但是通過以下假設:

sublist = sorted(sub_list, key=keys)

你的意思是:

sublist = sorted(sub_list, key=keys.index)

你有列表查找而不是哈希查找,因此排序從O(nlog(n))到O((n ** 2)* log(n))

為了將排序返回到nlog(n),您必須將鍵列表轉換為哈希,如下所示:

keys = dict(zip(keys, range(len(keys))))
sublist = sorted(sub_list, key=keys)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM