2010-07-09 62 views
3

說我想在Python中創建一個數組1,000,000三三兩兩(未列出),像這樣:什麼是在python中初始化整數數組的最快方法?

array = [2, 2, 2, ...... , 2]

會是什麼做的一個快速而簡單的方法是什麼?

+1

我幾乎不知道Python,但它可能是'array = [2 for x in 1..1000000]''? – 2010-07-09 15:52:51

+0

這個前面的問題可能有所幫助 - http://stackoverflow.com/questions/1859864/how-to-create-an-integer-array-in-python – chauncey 2010-07-09 15:52:57

+0

@mmyers:你的建議是無效的語法;你可能意指'[2 for xrange in xrange(1000000)]'; '[2] * 1000000'會更快更簡單;但是這些產生'list' - 'array'和'list'在Python中意味着不同的東西。 – 2010-07-09 20:47:46

回答

6

這是你在追求什麼?

# slower. 
twosArr = array.array('i', [2] * 1000000) 

# faster. 
twosArr = array.array('i', [2]) * 1000000 

你可以利用這個得到的只是一個列表:

twosList = [2] * 1000000 

- 編輯 -

我更新這反映了另一個答案的信息。通過略微調整語法,您可以將速度提高〜9:1。完整的功勞屬於@ john-machin。我不知道你可以像對列表一樣對數組對象進行多重處理。

+0

slooooo ...看我的回答 – 2010-07-09 20:31:15

1
aList = [2 for x in range(1000000)] 

或比盧普斯鏈接

anArray =array.array('i', (2 for i in range(0,1000000))) 
3

使用timeit模塊的基礎,你可以種搞清楚這樣做的最快是:

首先,把許多數字在列表中會最有可能殺死你的機器,因爲它會將它存儲在內存中。

但是,你可以使用像這樣的東西來測試執行。它跑到我的電腦很長一段時間之前,我只是放棄了,但我的舊電腦:

你可以看看
timeit.Timer('[2] * 1000000').timeit() 

療法另一種選擇是使用array模塊,它是說,efficient arrays of numeric values

array.array('i', (2 for i in range(0, 1000000))) 

我沒有測試兩者的完成時間,但我確信array模塊,它是專爲數字集將更快。

編輯:更有趣,你可以在numpy看看這實際上似乎有最快的執行:

from numpy import * 
array([2 for i in range(0, 1000000)]) 

更快速的從註釋:

a = 2 * ones(10000000) 

Awesmoe!

+1

numpy也有專門的工廠函數:'a = 2 * ones(1000000)' – Philipp 2010-07-09 16:27:49

+0

@Philipp:太棒了!這就是我喜歡SO的原因。好奇心回答一個問題導致了我自己的許多學習。歡呼聲:-) – Bartek 2010-07-09 16:29:02

+0

如果你無法將百萬元素的列表或數組放入你的機器內存,它已經死了。此外,我不明白「它長時間在我的電腦上運行」......查看我的答案(a)如何在命令提示符下使用'timeit'進行簡單的計時(b)測量時間毫秒!)是(運行Win XP SP2的4歲筆記本電腦) – 2010-07-09 20:35:46

11

目前接受的答案不是使用array.array的最快方式;至少它不是最慢的 - 比較這些:

[source: johncatfish (quoting chauncey), Bartek] 
python -m timeit -s"import array" "arr = array.array('i', (2 for i in range(0,1000000)))" 
10 loops, best of 3: 543 msec per loop 

[source: g.d.d.c] 
python -m timeit -s"import array" "arr = array.array('i', [2] * 1000000)" 
10 loops, best of 3: 141 msec per loop 

python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000" 
100 loops, best of 3: 15.7 msec per loop 

這是一個比例約爲9比1 ...

+0

+1,我用其他語法和註釋更新了我的答案。謝謝你指出。 – 2010-07-09 20:44:52

+1

slooow :) ...這兩個版本的混合比較好 – 2013-05-21 02:37:03

2

混合方法最快的作品對我來說

$ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000" 
100 loops, best of 3: 5.38 msec per loop 

$ python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000" 
10 loops, best of 3: 20.3 msec per loop 
$ python -m timeit -s"import array" "arr = array.array('i', [2]*10) * 100000" 
100 loops, best of 3: 6.69 msec per loop 
$ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000" 
100 loops, best of 3: 5.38 msec per loop 
$ python -m timeit -s"import array" "arr = array.array('i', [2]*1000) * 1000" 
100 loops, best of 3: 5.47 msec per loop 
$ python -m timeit -s"import array" "arr = array.array('i', [2]*10000) * 100" 
100 loops, best of 3: 6.13 msec per loop 
$ python -m timeit -s"import array" "arr = array.array('i', [2]*100000) * 10" 
10 loops, best of 3: 14.9 msec per loop 
$ python -m timeit -s"import array" "arr = array.array('i', [2]*1000000)" 
10 loops, best of 3: 77.7 msec per loop 
0

如果初始值並不一定是非零和,如果您有/開發/零您的平臺上,以下是大於陣列( 'L',[0])*尺寸的解決方案快約4.7倍:

myarray = array.array('L') 
f = open('/dev/zero', 'rb') 
myarray.fromfile(f, size) 
f.close() 

在問題How to initialise an integer array.array object with zeros in Python我正在尋找更好的方法。

相關問題