簡體   English   中英

Python比循環更具計算效率

[英]Python something more computational efficient than a loop

我正在嘗試使用以下代碼從python中的字典制作圖邊緣列表:

graph= []
for key, value in dic_test.items():
    for x in range (0,len(value)):
        if (x+1) < len(value):
            for y in range (1,len(value)):
                if y != x and y>x:
                    graph.append([value[x],value[y]])

這得到了我想要的東西,例如,如果我得到了這個測試詞典:

dic_test= {1: ['A', 'E','F','G'], 2: ['B', 'D','X'], 3: ['C',"Y"],4:[],5:['f','h']}

我得到以下輸出:

[['A', 'E'],
 ['A', 'F'],
 ['A', 'G'],
 ['E', 'F'],
 ['E', 'G'],
 ['F', 'G'],
 ['B', 'D'],
 ['B', 'X'],
 ['D', 'X'],
 ['C', 'Y'],
 ['f', 'h']]

問題是,當我運行一個大詞典時,它會一直運行到內核崩潰為止,我有什么想法可以使此代碼更高效?

您可以使用itertools.combinations()
(請參閱如何獲取列表元素的所有組合 ):

import itertools
dic_test= {1: ['A', 'E','F','G'], 2: ['B', 'D','X'], 3: ['C',"Y"],4:[],5:['f','h']}

_combinations = []
for _value in dic_test.values():
    _combinations.extend(list(itertools.combinations(_value, 2)))

print(_combinations)

[('A', 'E'),
 ('A', 'F'),
 ('A', 'G'),
 ('E', 'F'),
 ('E', 'G'),
 ('F', 'G'),
 ('B', 'D'),
 ('B', 'X'),
 ('D', 'X'),
 ('C', 'Y'),
 ('f', 'h')]

由於已經導入了itertools ,請使用itertools.chain()可以執行以下一項操作:

list(itertools.chain(*[list(itertools.combinations(_value, 2)) for _value in dic_test.values()]))

注意

1.演出問題:
-與list.extend() :每個循環7.23 µs
-使用itertools.chain() :每個循環8.15 µs

2.巨大,非常巨大,非常非常巨大的字典:
由於您對每個鍵的操作彼此獨立,因此您可以並行執行任務(如果需要,可以使用多處理文檔

Itertools可能會在這里為您提供幫助,因為每個邊緣只是每個子列表中頂點的2種組合:

import itertools

output = []
for links in dic_test.values():
    output += map(list, itertools.combinations(links, 2))
for val in dic_test.values():
     a=itertools.combinations(val,2)
     for c in a:
         print(c)

給出輸出

('A', 'E')
('A', 'F')
('A', 'G')
('E', 'F')
('E', 'G')
('F', 'G')
('B', 'D')
('B', 'X')
('D', 'X')
('C', 'Y')
('f', 'h')

除了提供itertools的建議外,值得注意的是,您還有一些不相交的點擊。 這意味着您不需要一次執行所有這些計算,當然也不需要同時將所有結果存儲在內存中。 這也意味着您可以並行化

暫無
暫無

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

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