說我想在Python中創建一個數組1,000,000三三兩兩(未列出),像這樣:什麼是在python中初始化整數數組的最快方法?
array = [2, 2, 2, ...... , 2]
會是什麼做的一個快速而簡單的方法是什麼?
說我想在Python中創建一個數組1,000,000三三兩兩(未列出),像這樣:什麼是在python中初始化整數數組的最快方法?
array = [2, 2, 2, ...... , 2]
會是什麼做的一個快速而簡單的方法是什麼?
這是你在追求什麼?
# slower.
twosArr = array.array('i', [2] * 1000000)
# faster.
twosArr = array.array('i', [2]) * 1000000
你可以利用這個得到的只是一個列表:
twosList = [2] * 1000000
- 編輯 -
我更新這反映了另一個答案的信息。通過略微調整語法,您可以將速度提高〜9:1。完整的功勞屬於@ john-machin。我不知道你可以像對列表一樣對數組對象進行多重處理。
slooooo ...看我的回答 – 2010-07-09 20:31:15
aList = [2 for x in range(1000000)]
或比盧普斯鏈接
anArray =array.array('i', (2 for i in range(0,1000000)))
使用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!
numpy也有專門的工廠函數:'a = 2 * ones(1000000)' – Philipp 2010-07-09 16:27:49
@Philipp:太棒了!這就是我喜歡SO的原因。好奇心回答一個問題導致了我自己的許多學習。歡呼聲:-) – Bartek 2010-07-09 16:29:02
如果你無法將百萬元素的列表或數組放入你的機器內存,它已經死了。此外,我不明白「它長時間在我的電腦上運行」......查看我的答案(a)如何在命令提示符下使用'timeit'進行簡單的計時(b)測量時間毫秒!)是(運行Win XP SP2的4歲筆記本電腦) – 2010-07-09 20:35:46
目前接受的答案不是使用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 ...
+1,我用其他語法和註釋更新了我的答案。謝謝你指出。 – 2010-07-09 20:44:52
slooow :) ...這兩個版本的混合比較好 – 2013-05-21 02:37:03
混合方法最快的作品對我來說
$ 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
如果初始值並不一定是非零和,如果您有/開發/零您的平臺上,以下是大於陣列( '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我正在尋找更好的方法。
我幾乎不知道Python,但它可能是'array = [2 for x in 1..1000000]''? – 2010-07-09 15:52:51
這個前面的問題可能有所幫助 - http://stackoverflow.com/questions/1859864/how-to-create-an-integer-array-in-python – chauncey 2010-07-09 15:52:57
@mmyers:你的建議是無效的語法;你可能意指'[2 for xrange in xrange(1000000)]'; '[2] * 1000000'會更快更簡單;但是這些產生'list' - 'array'和'list'在Python中意味着不同的東西。 – 2010-07-09 20:47:46