我寫了一個Python模塊通過檢查列表中的重疊的項目/與另一個列表項相交,以找到一個列表的子集相交。我模塊的主要部分看起來是這樣的:尋找重疊的/一個巨大的名單亞羣的另一大名單
from collections import defaultdict
有總的overalllist 1865390個項目(項目是數組)
overalllist = [(8361474, 8363645), (8363182, 8363758), …, (14634342, 14634440)]
有在MYLIST共有608348項
mylist = [(8362677, 8363216), (8414202, 8414313), …, (14634354, 14634397)]
查找列表的子集
def mysubsets(list1, list2):
sublist = [(x, y) for x, y in list1 if x <= list2[1] and y >= list2[0]]
return sublist
對於上面給出我的示例列表,MYLIST的第一項,(8362677,8363216),重疊與前兩個項overalllist的,[(8361474,8363645),(8363182,8363758)]。因此,對於(8362677,8363216),整體列表的子集是[(8361474,8363645),(8363182,8363758)],...
初始化將填充項目的空字典作爲鍵和子集從overalllist通過在MYLIST每個項目值
mydict = defaultdict(list)
循環並找到overalllist子集,並把它們放到mydict
for item in mylist:
sublist = mysubsets(overalllist, item)
mydict.update({item:sublist})
輸出看起來是這樣的
>>> mydict
defaultdict(<type 'list'>, {(14634354, 14634397): [(14634342, 14634440)], …, (8362677, 8363216): [(8361474, 8363645), (8363182, 8363758)]})
我的劇本作品,但極其緩慢(它跑了大約18小時)。我檢查使用CPROFILE的執行時間,發現mysubsets()花了大量的時間:
ncalls tottime percall cumtime percall文件名:LINENO(功能)
608348 1732.827 0.003 1732.827 0.003 mymodule.py:383(mysubsets )
我不知道是否有任何最快速,高效的方式來實現我的目標。謝謝。
所以在每個列表中你有一系列的時間間隔,對吧?我們可以假設每個列表中的間隔在它們之間沒有重疊嗎? –
列表是否已分類? – tglaria
@tglaria:我排序了兩個列表。 – lisa