簡體   English   中英

在python中初始化整數數組的最快方法是什么?

[英]What is the fastest way to initialize an integer array in python?

假設我想在 python 中創建一個包含 1,000,000 個二進制的數組(不是列表),如下所示:

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

什么是快速但簡單的方法?

當前接受的答案不是使用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 的比率......

這是你追求的嗎?

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

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

你可以得到一個列表:

twosList = [2] * 1000000

-- 編輯 --

我更新了這個以反映另一個答案中的信息。 看起來您可以通過稍微調整語法以大約 9 : 1 的比例提高速度。 全部功勞屬於@john-machin。 我不知道您可以像處理列表一樣對數組對象進行多重處理。

混合方法對我來說效果最快

$ 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

使用timeit模塊,您可以找出最快的方法是什么:

首先,將這么多數字放在列表中很可能會殺死您的機器,因為它會將其存儲在內存中。

但是,您可以使用類似的方法測試執行。 在我放棄之前它在我的電腦上運行了很長時間,但我在一台舊電腦上:

timeit.Timer('[2] * 1000000').timeit()

您可以研究的另一個選項是使用數組模塊,如前所述, 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)

驚人的!

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

或基於昌西鏈接

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

如果初始值不必非零,並且您的平台上有 /dev/zero 可用,則以下解決方案比 array('L',[0])*size 解決方案快約 4.7 倍:

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

在問題如何在 Python 中用零初始化整數 array.array 對象我正在尋找更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM