2011-10-03 69 views
1

我有兩個字典對象,連接和網絡。這可以形象化爲一個圖形,其中每個節點是一臺計算機,並且連接表示計算機和節點之間的邊界。網絡是唯一的網絡的字典對象,其中計算機可以是一個部件,用於離Python中的非順序循環優化

1,2 
2,3 
4,5 
5,1 

是節點1的四個連接信息通過1個
連接從而將{1-> 1,2-> 1 ,3> 1,4-> 2,5-> 1}
和網絡{1-> 0,2-> 1}
這意味着
計算機1,2,3,5是N/w 1
計算機4是n/w 2的一部分
再次n/w 2互連到n/w 1
我必須讀取文件這樣的連接信息
千元,而這樣做,爲每個連接的信息閱讀我有如下

while network.has_key(connections[node1]): 
    connections[node1]=network[connections[node1]] 

有沒有更好的方式來優化上述環能進行非連續循環?如果需要,我可以分享我的整個代碼爲宗旨

+0

「非順序循環」是什麼意思?據推測,你正在順序閱讀單個文件,我認爲這是你的瓶頸。 –

+0

你有沒有想過分析你的代碼? CProfile是偉大的http://docs.python.org/library/profile.html - 之後,你將清楚你的瓶頸是什麼 –

+0

@oxtopus,請檢查代碼片段。非序列意味着我既不能使用列表理解也沒有任何列表功能,如減少... – Abhijit

回答

1
while network.has_key(connections[node1]): 
    connections[node1]=network[connections[node1]] 

該代碼確實爲network[connections[node1]]查找一次兩次has_key和一次[]

也多次訪問connections[node1]

相反,你可以這樣做:

current = connections[node1] 
while True: 
    try: 
     current = network[current] 
    except KeyError: 
     break 
connections[node1] = current 

但機會是更好的改進就可以了可以重新加工您的代碼的其餘部分。但爲此,您可能會發現http://codereview.stackexchange.com是一個更好的網站。

+0

愚蠢的我。我對此完全失明。我以某種方式試圖從完全不同的角度來看待這個問題。 – Abhijit

+0

從cProfiler中我發現這行代碼是我整個系統的瓶頸。在這裏縮短50%的時間最終可以減少20%的處理時間。 – Abhijit

+0

@ user977038,也許通常你通過避免來到這裏來解決這種事情,而不是讓它更快。 –

2

我真的不明白你的問題,但我覺得股票答案繪製相關的問題在這裏也適用:

使用NetworkX而不是試圖拿出自己的數據表示和算法。學習起來可能比較困難,但從長遠來看,這會節省您的時間和頭痛。

+0

我實際上使用NetworkX來創建我的程序的最初原型。工作得很好。我現在試圖在沒有它的情況下編碼。因爲我在這裏優化每一點我覺得有明顯的理由表現有瓶頸。 – Abhijit

+0

啊。然後看看Cython。 –