python没有指针如何实现链表_[转]为什么python标准库没有实现链表
實際上剛開始學習一些高級語言的時候我也有同樣的疑問,而且即使有鏈表對應物的語言,鏈表常常也很少被實際使用。
如果是在國外聽數據結構的課,老師一般會警告你這只是一個理論概念,實際應用應該實際考察,在通常情況下鏈表不是一個很好的結構。
通常鏈表會作為一個很好的反例,告訴大家脫離實際硬件環境來談論所謂算法復雜度是沒有任何意義的。
這是因為,鏈表已經不適合當今的計算機硬件發展。當今的計算機硬件對內存是否連續更為敏感,而鏈表恰恰會破壞這種順序讀取。
由于locality很差所以常常造成page fault和cache miss
這也是為什么大多數教師不再推薦使用鏈表的原因。而且現今的硬件內存拷貝實際相當迅速。
并且python的list算法不是通常的單項表,也不是通常的數組。
具體可以看這里:http://wiki.python.org/moin/TimeComplexity
在List末尾append/pop都是O(1)的,
如果要在頭部或者中部插入是O(n),任何破壞連續性的操作都會被要求realloc,所以任何此類操作都是O(n)
但是當今的常用硬件,使用C寫的鏈表和python的list,在insert的時候只有n>50000才讓鏈表比list快那么一點點。
這還沒有考慮其他實際操作的復雜度。加上前面說的破壞locality,導致鏈表完全沒有吸引力。在對象特別多的時候通常我們直接抽象它為數據庫,也不要去想什么鏈表了。
在需要用到linked list特性的地方,比如常常需要從頭部append或者pop
這時候有python的deque. (這里我記錯了,特此更正,deque如果做insert還是會導致內存拷貝/移動,這里面的關鍵思想就是目前硬件的內存拷貝相當快,不是相當長的東西都可以接受)
deque也不是通常的簡單數據結構,它是經過認真權衡過后得到的一種混合式數據結構。
他是一個鏈式塊結構,每個塊包含62個對象,以此來平衡對locality的優化和對push, pop的優化。有人問為啥是62個而不是其他數:那是因為deque是個雙向鏈表,一個節點64個指針,一個指向前一個指向后,剩下就是62個指針用來指向對象
要做到對insert到中間的優化是用btree和array結合的辦法,有個第三方包blist
但是我估計很少有應用會真正用到這個。insert是O(log n)
http://pypi.python.org/pypi/blist/
其實python是大師設計的語言,他們來決定底層具體的數據結構,作為一般人,你沒有必要去質疑大師們精心設計的東西。
如果你真的對性能有很大要求,python也許并不適合你,python不是作為純粹針對高性能計算誕生的東西,
他是一種膠水語言,它只對常見的List長度,常用的算法結構進行優化。他希望達到的目的是把現實的應用抽象出來,讓使用者不用關心具體的數據結構和算法。
pythonic是一種面向大眾的編程態度
如果你要用它來做其他事情,可以看看有沒有你需要的第三方模塊,或者可以用C來實現自己的一個模塊,python本來就是C寫的,所以這實際上也一點不困難。
比如python里面沒有一個數據結構是能用來很好表示數值運算中使用的大型矩陣或者數組的,這時候就誕生了第三方包:numpy
總結
以上是生活随笔為你收集整理的python没有指针如何实现链表_[转]为什么python标准库没有实现链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么保时捷启动总要排风呢?
- 下一篇: python 排名函数_一个危险的Pyt