我有一个二进制值文件。我正在查看的部分是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
,没有任何差异。
答案 0 :(得分: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)