我使用python設置計算強度的模擬,然後在定製的C擴展中運行它,最後在python中處理結果。在模擬過程中,我想存儲固定長度的浮點數(C雙精度轉換爲PyFloatObjects),它代表每個時間步的變量,但我不知道會提前多少時間步。一旦模擬完成,我需要將結果傳遞迴python,其形式爲記錄每個單獨變量的數據可以作爲類似列表的對象(例如(連續數組的包裝),分段連續陣列或矩陣中有固定步幅的列)。在Python C擴展中記錄未知數量的浮點數
此刻,我創建了一個字典,將每個變量的名稱映射到包含PyFloatObject對象的列表。這種格式非常適合在後期處理階段工作,但我有一種感覺,創作階段可能會快很多。
時間是非常重要的,因爲模擬已經是一個計算繁重的任務。我期望A.購買大量內存和B.明智地設置你的實驗將允許整個日誌適合內存。但是,使用目前的字典列表解決方案將每個變量的日誌保存在連續的內存部分中需要大量的複製和開銷。
我的問題是:什麼是快速記錄千兆字節內存雙倍空間/時間開銷最小的巧妙,低級別的方法,仍然轉化爲一個整潔的Python數據結構?
澄清:當我說 「記錄」,我的意思是保存,直到模擬之後。一旦完成後處理階段,大多數情況下我只會存儲結果圖。所以我實際上並不需要將這些數字存儲在磁盤上。
更新:最後,我改變了我的做法一點,添加日誌(作爲一個字典映射變量名的序列類型)給函數的參數。這允許您傳入諸如列表或數組。陣列或任何具有附加方法的對象。這增加了一點時間開銷,因爲我使用PyObject_CallMethodObjArgs函數來調用Append方法而不是PyList_Append或類似方法。使用數組可以減少內存負載,這看起來是我可以做的最少的編寫我自己擴展的存儲類型的最佳選擇。感謝大家!
你看過numpy嗎?創建一個numpy雙精度數組,而不是PyFloatObjects的正常PyList實際上更容易從C,以及更快的雙方和更高的內存效率。 – abarnert 2012-08-16 21:13:08
另外,您是否確實需要在內存中擁有千兆字節的雙精度,並找到將它們轉儲到磁盤的方法,或者您是否可以首先使用磁盤上的結構? (這可能與雙精度C數組的mmap一樣簡單,您可以通過'struct'模塊從Python解釋)。 – abarnert 2012-08-16 21:14:57
感謝您的建議! Numpy數組雖然是固定大小的,但我只能通過將一個numpy數組圍繞一個C數據塊_after_將其存儲在我使用某種自釀的擴展數組結構自己分配的空間中來有效地執行此操作。我真的很喜歡編寫代碼,但是我想知道C程序員的世代是不是已經比我想出來的東西更快了:) – 2012-08-16 21:18:15