2017-04-12 45 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)