2015-10-07 131 views
-1

我在學習Python,並且在循環詞典時對迭代速度感到困惑。在其中一篇教程中,我們不得不遍歷字典併爲假設的超市提取「關鍵」項目。我問了一個關於最佳實踐原則的問題來遍歷一本字典,並被告知爲了迭代目的對字典進行排序並不是真的是,直到你處理「大」數據集,所以我不應該擔心它。字典迭代速度

我不確定導師說爲什麼不要緊,因爲我相信速度是處理大型數據集的關鍵。我做了一些閱讀並發現了一篇非常有用的文章(Python: List vs Dict for look up table)。

由此,我可以假設,根據任務,字典的排序是情境?或者你會說一個人應該總是排序字典的最佳處理速度?

把它放在更多的上下文中 - 讓我們用下面的例子: 假設我們正在搜索一個含有10,000個條目的字典中的一堆腰果的價格。在這種情況下,如果條目以隨機方式放置在詞典中 - 如果搜索條目被分類,搜索速度會更快,而不是隨機放置在任何位置?

非常感謝!

+4

Python字典是散列函數的實現。請參閱https://en.wikipedia.org/wiki/Hash_table和http://stackoverflow.com/questions/114830/is-a-python-dictionary-an-example-of-a-hash-table – Alexander

+0

詞典未排序集合...但是他們有非常快速的項目查找(O(1)) –

+1

*排序*字典?爲什麼會以任何方式提高速度? – user2357112

回答

1

爲了把這個在更多的背景 - 讓我們用下面的例子:假設我們 在其中有10000個條目的字典 尋找一羣腰果的價格。在這種情況下,如果條目在字典中以隨機方式放入 - 搜索 的速度是否快速,如果它被排序,而不是在任何地方隨機放置 ?

物品的放置方式並不重要,重要的是如何檢索物品 - 因爲這基本上就是您如何衡量物品的性能。

詞典使用散列表爲了通過鍵檢索項目。這意味着物品存儲順序無關緊要,因爲檢索速度/方法/功能不依賴於插入順序。

換句話說,當你有一個字典d和你的操作,例如:

print(d[some_key]) 

some_key值的檢索是不依賴它被插入順序的詞典。如果插入詞典的第一個,第二個或最後一個項目,它將以相同的工作效率進行檢索。

+0

感謝Burhan - 這非常有趣。當你說他們是如何檢索的時候,你能詳細說明你的意思嗎?到目前爲止,我剛剛學會了使用for循環遍歷列表並吐出我正在尋找的值 – azurekirby

+0

我的意思是,當您通過引用鍵請求字典中的項目時。查看更新。 –

+0

非常感謝Burhan!這幫助我瞭解它 – azurekirby

1

把這個放在更多的上下文中 - 讓我們用下面的例子:假設我們正在搜索一個含有10,000個條目的字典中一堆腰果的價格。在這種情況下,如果條目以隨機方式放置在詞典中 - 如果搜索條目被分類,搜索速度會更快,而不是隨機放置在任何位置?

那麼......字典已經有了排序,因爲它們是散列表。不同之處在於,它們是按照它們的散列而不是按鍵本身進行排序的。這意味着一旦哈希已經被計算出來,基本上沒有什麼可以進一步提高訪問速度了。收益可以在散列算法中找到,而不是在項目或結構本身中找到。

+0

太好了 - 謝謝!我的印象是任何事情,即使是字典(我現在明白它都是散列表)都可以進一步優化。我正在閱讀這些內容以進一步理解(http://cs.stackexchange.com/questions/249/when-is-hash-table-lookup-o1) - 如果我說這是正確的,排除這些情況在鏈接中提到,有一個未排序的字典是完全正確的,因爲它不會影響查詢速度? – azurekirby

+0

詞典不是「未排序的」,它們只是以用戶無法利用的方式進行排序。散列表可以通過將散列算法調整爲關鍵字來優化。 –