1樓:
內部應該是個動態陣列,但是陣列記憶體的應該是指向堆的位址。我也剛開始了解python 望指正。我也是根據資料結構的特點猜的
2樓:
你要知道,dict的key可以不是數字,所以就不能用陣列下標來直接訪問。不管是陣列還是鍊錶,線性查詢都是O(n)的複雜度,而dict基於更複雜的資料結構(可能是雜湊表?我不太清楚Python 怎麼實現的),查詢的時間複雜度要遠低於此(雜湊表的話就是O(1))
3樓:
python的list是動態陣列(Dynamic array - Wikipedia)。
Python裡面的Doubly linked list(雙向鍊錶)是用 collections 模組裡的 deque。
時間複雜度參考: TimeComplexity - Python Wiki
效能比較:
>python
-mtimeit-s
'import collections'-s
'c = collections.deque(xrange(1, 100000000))'
'c.pop()'
10000000
loops
,bestof3
:0.11
usec
perloop
>python
-mtimeit-s
'c = range(1, 100000000)'
'c.pop()'
10000000
loops
,bestof3
:0.174
usec
perloop
>python
-mtimeit-s
'import collections'-s
'c = collections.deque()'
10000000
loops
,bestof3
:0.116
usec
perloop
>python
-mtimeit-s
'c = '
'c.insert(0, 1)'
100000
loops
,bestof3
:36.4
usec
perloop
4樓:EMayej
假設有names = ['張三', 『李四』, .....中間一堆...., '趙五', ...另外一堆...]
scores = [77, 88, .....中間一堆..., 99, ...另外一堆...]
names和scores裡面的元素是一一對應的,那麼,如何查詢'趙五'的分數呢?因為我們並不知道'趙五'是names裡面的第幾個元素,所以必須要遍歷。
別人說的是這個:
for index, name in enumerate(names):
if name == '趙五'print(scores[index])
只要你找出index了,取出來當然是很快的。這個取的過程就是你說的「首位址+偏移位址」,即scores[index].
但是怎麼知道index呢?這個過程慢。
你的理解是針對scores[index]的:
scores是陣列所以scores[index]快,如果scores是鍊錶的話要還要挨個遍歷所以scores[index]慢。。。
從這點來說你的理解是對的,鍊錶找第幾個確實比陣列找第幾個慢得多。因為鍊錶要挨個遍歷,陣列直接取偏移位址就好了。
但是這個跟別人說的事情不是一回事:
別人說的是找這個偏移位址慢 (for index, name in enumerate(names):)
你說的是找到這個偏移位址之後取值慢 ( scores[index] )
你可以試一下deque,那個就是鍊錶。自己手動實現一下,用timeit之類的測一下。
比在這問問題強。
那麼為什麼dict快呢,簡單的來說,dict並不是逐一比較名字,它本身在儲存的時候就帶了查詢的結構,所以查起來快. 具體實現的話,看看hash table是咋回事就行了。
5樓:叢小放光
是的,題主對dict的本質還不太清楚。
list 是用陣列實現的,dict 使用hash表實現的。
這個你就不必懷疑了。
如你所說,用兩個list(陣列)存名字和成績。
查詢時需要逐一比較名字,複雜度是o(n)
但雜湊表的查詢效率是o(1)。
6樓:nJcx
list 實現方式是 arraylist,即陣列,
沒人會用鍊錶實現儲存很多元素的資料結構的,O(n)時間訪問完全不可容忍除非確定這個鍊錶一定不太大(比如鍊錶經常被用來解決Hash表衝突)陣列的插入是慢點,不過現在記憶體操作很快的,無所謂了。
python 中list物件的儲存結構採用的是線性表,因此其查詢複雜度為O(n),而dict物件的儲存結構採用的是雜湊表(hash表),其在最優情況下查詢複雜度為O(1)。
c 裡有沒有類似python中list的結構?
冒泡 若說資料結構本身的模擬,那就是vector 如果說要可以裝不同資料型別,那不是容器本身要管的事情,最簡單的,你弄個vector,啥都能往裡面塞了 薛丁格的貓 這是因為C 和python的從一開始的設計理念就不同。C 中如果只用問題中的那種大而全的資料結構,在某些情況下,效率會非常低。如果你確實...
如何用python以二維陣列的特徵向量為主軸 特徵值為軸長度,畫橢圓?
fig plt.figure figsize 10,10 ax fig.add subplot 111 for imat in range 10 randmat random.uniform 0,1,4 reshape 2,2 randmat 0 1 randmat 1 0 vals,vs eig ...
python中如何將乙個陣列中有關聯的不同元素進行分類?
Justin Z s 1,1,5,6,8,8,2,3,17,18,27,55 a b fori,j inlist zip sorted s sorted s 1 0 a.i if j i 1 b.a a b.a print b 1,1,2,3 5,6 8,8 17,18 27 55 拋個磚 時間關係...