2016-06-28 41 views
0

我在python中工作,我遇到了一個問題:我必須初始化一個巨大的數組(21 x 2000 x 4000矩陣),以便我可以複製它的子矩陣。 問題是我希望它非常快,因爲它是用於實時應用程序,但是當我運行numpy.ones((21,2000,4000))時,創建此矩陣需要大約一分鐘的時間。 當我運行numpy.zeros((21,2000,4000))時,它是即時的,但只要我複製子矩陣,它需要一分鐘,而在第一種情況下,複製部分是即時的。用numpy初始化一個大矩陣的方式太長

有沒有更快的方式來初始化一個巨大的數組?

+0

*巨大*是你的關鍵詞,無論你做什麼,它都需要一段時間設置1.68億分,所以最好只做一次...... –

+0

我認爲這種差異來自'numpy.zeros似乎創建了一個稀疏矩陣,比實際的矩陣要輕。因此,當您複製它時,它將創建實際的矩陣,這需要一分鐘,因爲它是一個巨大的矩陣(168M單元)。我認爲你不會有更快的方式來初始化這種尺寸的矩陣。 – ysearka

回答

1

我想沒有更快的方法。您構建的矩陣非常大(8字節的float64 x 21 x 2000 x 4000 = 1.25 GB),並且可能佔用了系統中大部分物理內存;因此,等待的一分鐘可能是因爲操作系統必須將其他東西分頁以騰出空間。您可以通過在您分配內容並觀看內存使用和分頁時觀看top或類似內容(例如,系統監視器)來檢查。

numpy.zeros在您調用它時似乎是即時的,因爲內存是由操作系統懶洋洋地分配的。但是,只要您嘗試使用它,操作系統實際上必須在某處適合該數據。請參閱Why the performance difference between numpy.zeros and numpy.zeros_like?

您是否可以重構代碼,以便僅創建您打算複製的子矩陣,而不必創建大矩陣?

+0

感謝您的澄清。可能不可能不使用巨大矩陣,這是一個包含21個通道的大圖像(實際上,深度學習中它實際上有21個類別,具有邏輯像素標記的概率)。 子矩陣是神經網絡的輸出,它取決於層中輸入的步幅大小...... –

+0

在這種情況下,正如@CSᵠ所述,您可能能夠在輸入之前預先分配矩陣進入您的應用程序的實時循環。如果您可以小心總是重新使用分配的內存,則只需等待一分鐘。 – wildwilhelm

+0

如果我假設你正在分配'float64',你也可以嘗試改變'dtype'。使用'float32'只需要640 MB,這可能會更快... – wildwilhelm