2017-04-12 32 views
-1

我有一個二進制值的文件。我在看的部分是4字節INT與在MW1, MVAR1, MW2, MVAR2,...我該如何改進文件數據的批量計算

模式的值我與

temp = array.array("f") 
temp.fromfile(file, length *2) 
mw_mvar = temp.tolist() 

我再計算這樣的幅度讀出值。

mag = [0] * length 
for x in range(0,length * 2, 2): 
    a = mw_mvar[x] 
    b = mw_mvar[x + 1] 
    mag[(x/2)] = sqrt(a*a + b*b) 

計算(不是讀取)是我的腳本的總長度加倍。我知道(理論上)有一種方法可以更快地完成這個任務,因爲我模仿一個最終會調用fortran的腳本(pyd可以調用Fortran中的函數dll),它能夠對運行時間產生微不足道的影響。

這是我能想到的最好的。任何改進建議?

我也試過math.pow(),**.5,**2沒有區別。

+1

您的代碼段不完整,因爲您忽略了某些術語的定義,例如'thermal_mva_results_base'。你對f文件的解釋也很薄弱。請給出一個更完整的文件示例,文件通常長度的聲明以及完整的代碼片段。變量的類型和數據對您的問題很重要。 –

+0

@RoryDaulton對不起,這是一個錯字。我簡化了帖子的名稱,並沒有改變那個。 – blindguy

回答

0

沒有運氣改善計算,我繞過這個問題。我意識到我只需要這些計算值的1%,所以我創建了一個類來根據需要計算它們。對於(對我來說)結果代碼的行爲類似於計算值列表非常重要。該過程的其餘部分使用這些值,並且預先計算了不同版本的數據。該類意味着我並不需要一套程序數據

class mag: 
    def __init__(self,mw_mvar): 
     self._mw_mvar = mw_mvar 
     #_sgn = sgn 
    def __len__(self): 
     return len(self._mw_mvar/2) 
    def __getitem__(self, item): 
     return sqrt(self._mw_mvar[2*item] ** 2 + self._mw_mvar[2*item+1] ** 2) 

PS這也可以在一個函數來完成的各個版本,並採取兩個版本。我將不得不對整個腳本進行更多的更改。

function (a,b,x): 
    if b[x]==0: 
     return a[x] 
    else: 
     return sqrt(a[x]**2 + b[x]**2)