2015-02-10 196 views
1

我正在運行一些模擬過程太慢,因此我對我的代碼進行了剖析,發現超過90%的時間花在將(2D)numpy數組轉換爲字符串,如:將numpy數組轉換爲字符串的最有效方法

arr = np.ones(25000).reshape(5000,5) 
s = '\n'.join('\t'.join([str(x) for x in row]) for row in arr] 

我嘗試了很多不同的解決方案(使用地圖,將使用astype(STR)的陣列,鑄造到一個列表),但大多數只給了邊際改善。

最終我放棄了試圖將數組轉換爲字符串,並使用np.save(arr),這給了一個2000X(!)加速其保存到自身的文件。有沒有辦法將數組寫成具有類似性能的文本文件?

回答

2

將numpy數組轉換爲人類可讀形式決不會確定模擬的運行時間。事實上,它甚至不應該貢獻(顯着)。

您應該在不同的級別上解決這個問題。問問自己:你真的需要多長時間將數組寫入文件中人可讀的表單?它是否需要經常/經常發生,以至於它明顯決定了代碼的運行時間?只有當一次,當某個結果存在時,它是否足夠?

當你採取這種方法時,你可能不需要優化你當前的書寫方法。我可能想給一些數字。考慮到你的模擬需要大約一個小時(沒有將結果寫入磁盤)。我認爲那麼你同意,如果你的代碼花費了10秒的時間將結果寫入磁盤,這是可讀的。如果這需要10秒,1秒或100秒,那真的沒有關係。

如果出於某種原因,您確實需要定期將您的中間結果寫入磁盤以供日後處理 - 將頻率降至最低,並使用二進制數據格式。

+0

是的,這就是我最終做的 - 每個模擬只需要大約1.5毫秒,然後轉換爲一個字符串需要大約500毫秒。 – 2015-02-10 18:39:18

+0

那麼 - 你的問題解決了嗎?如果不是這樣:您需要執行多少次這些短模擬?什麼是輸出文件?對於人類還是機器?這些輸出文件有多大? I/O是一個限制因素嗎? – 2015-02-10 18:40:51

+0

是的,問題解決了。我只是想知道是否有一種方法可以將numpy數組寫入字符串,其性能與np.save(fn,arr)相同。 – 2015-02-10 18:42:55

2

嘗試使用np.savetxt(「file」,arr)。請參閱此處的文檔 - (http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html)。

+0

是的,試過了,還是太慢了。 – 2015-02-10 18:39:44

+0

因爲OP沒有提到他們試過這個,所以我並不完全贊同這裏的提議。國際海事組織你永遠不會像savetxt一樣快(這是針對C中的工作進行手工優化),所以這確實回答了這個問題。也就是說,Jan的答案是最好的 - 不要優化這個位/找出使用二進制數據的方法。 – 2015-02-10 19:10:23

相關問題