2012-07-17 42 views
1

我需要創建一個整數數組的數組,如[[0,1,2],[4,4,5,7]...[4,5]]。內部數組的大小可變。內部陣列的最大數量是2^26。那麼你如何以最快的方式更新這個數組? 當我使用list=[[]] * 2^26初始化非常快,但更新非常緩慢。相反,我使用在Python中快速訪問和更新整數矩陣或數組

list=[] , for i in range(2**26): list.append.([])

現在初始化很慢,更新很快。例如,對於2^26元素陣列,每個陣列上的16777216內部陣列和0.213827311993個元素的平均數量爲1.67728900909秒。這是好的,但我會做更大的數據,因此我需要最好的方法。初始化時間並不重要。 謝謝。

+2

兩點:1.不要調用列表'list',因爲它會遮住內置的名字;和2.你的第一個片段不會做你的想法,試試:'a = [[]] * 10;一個[0] .append( 'A'); a'看看會發生什麼...... – detly 2012-07-17 06:36:57

+1

小調優:用'xrange'代替'range' – xvatar 2012-07-17 07:16:33

+0

嗯你是對的list = [[]] * 2^26是完全不同的。謝謝。 – 2012-07-17 07:24:49

回答

0

你問的是一個很大的問題。不同的數據結構有不同的屬性。一般來說,如果您需要快速訪問,請不要使用列表!它們具有線性訪問時間,這意味着您投入的時間越長,訪問元素的平均時間就越長。

你也許可以使用numpy?該庫具有可以快速訪問的矩陣,並且可以在運行中進行重新設計。但是,如果要添加或刪除行,它可能會有點慢,因爲它通常會重新分配(從而複製)整個數據。所以這是一種折衷。

如果你將有這麼多的不同大小的內部數組,也許你可以有一個包含內部數組的字典。我認爲如果它被整數索引,它將比列表快得多。然後,可以用numpy創建內部數組。

+1

你爲什麼說'list'具有線性訪問時間?根據這個[page](http://wiki.python.org/moin/TimeComplexity)'list'具有O(1)的訪問時間。它實現爲一個數組 – xvatar 2012-07-17 07:14:18

+0

正是我在做的是,我有一個名爲nums的整數列表包含大約300個數字。另一個列表包含掩碼中大約310000個元素。然後用所有蒙版掩碼nums數組中的每個數字。然後通過掩碼的結果在nums數組中索引數字。例如,如果'100'是nums數組中的一個元素。 İf在掩碼列表中有2個元素'1'和'2'。結果[1^100] = 100,結果[2^100] = 100。列表的工作速度比字典快一點。我在這裏做每個操作後的插入。 nums數組將包含300萬個數字,因此需要花費很多時間。 – 2012-07-17 07:31:29

+0

我th列表版本是足夠快。問題在於產生花費很多時間的數字。 – 2012-07-17 11:54:12