從Python的數據結構說起

jopen 9年前發布 | 20K 次閱讀 Python Python開發
 

正值畢業季,這些天一直忙于面試各個踏出校門的大學生。慣例性的,我會出一些看似很簡單,但其實很刁鉆的題目,主要是看看面試者的知識是否可以用“扎實”來形容。

對于Python來說,我習慣性的一個問題是“Python常用的dict, list, set數據結構有什么區別?”然后就是設定一個場景看看更適合什么結構實現之類的問題。談不上是難題,但回答的結果有些大失所望。

作為自己給自己出的題目,我決定自己挑戰一把。

Dict(或者說dictionary, 字典)

從字面上看得出,它是一系列key=>value的映射關系的集合,底層映射到hash map數據結構。Python(json)中可以通過{“key”: value}的方法快速建立一個dict,但Python要求key必須為一個str。

由于底層為hash map,根據key找到value的復雜度為O(1)。非常適合對于成員進行頻繁的查找和更新操作。

最快速的耗盡內存的方法dict(zip(range(10**10), range(10**10)))

List(列表)

不定長的連續內存空間。訪問時需要例編元素,所以查找元素的復雜度是O(n)。Python中可以使用[1,2,3]的方式快速建立list。可以用[i+1 for i in list]的方式(列表解析式)實現一個map操作。當然更為快速且變態的解析式是(i+1 for i in list)。

考慮到性能和資源的耗用,Python 2.4以后在在使用List的時候可以考慮使用yield等方式實現一個迭代器,迭代器并不會將所有元素加載到內存。

List 對象可以使用 * 和 + 操作

Set(無序隊列)

表現非連續的內存空間,相對List來說,內存利用率高。要求內部元素不能重復。一般用來做數據的交差并補計算。可以用set(list)的方法將一個List轉為一個Set。

List去重的快速方法是轉成set再轉回list(list(set(list)))

只有set對象默認就定義了+ – & | 操作。

字符

對于字符的操作,由于直接格式化系統上是直接調用了stdio的printf,性能上遠好于字符串的+運算。

同理,字符串的join方法也是最高效的列表轉字符的方式。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!