这只是代码的一部分,每次迭代(单个el)需要大约5分钟才能执行。
fieldvalues的长度大约为1e6。我认为多次追加正在吞噬时间,有没有其他方法呢?
PK2=[]
E_pl=[]
E_tot=[]
for k in range(103,109):
PK2_k=[]
E_pl_k=[]
E_tot_k=[]
b=frame.fieldOutputs['SDV'+str(k)]
fieldValues=b.values
for v in fieldValues:
PK2_k.append(v.data)
PK2.append(PK2_k)
b=frame.fieldOutputs['SDV'+str(k+6)]
fieldValues=b.values
for v in fieldValues:
E_tot_k.append(v.data)
E_tot.append(E_tot_k)
b=frame.fieldOutputs['SDV'+str(k+12)]
fieldValues=b.values
for v in fieldValues:
E_pl_k.append(v.data)
E_pl.append(E_pl_k)
t3=time.time()
print stepName,"All PK,E terms written",t3-at,"Sec"
PK2=np.array(PK2)
PK2=np.transpose(PK2)
E_tot=np.array(E_tot)
E_tot=np.transpose(E_tot)
E_pl=np.array(E_pl)
E_pl=np.transpose(E_pl)
提前致谢!
答案 0 :(得分:1)
这是一个快速清理你的代码,可能会有所帮助,但可能不是很多。为了获得更大的加速,我们需要查看frames
包含的内容,并了解您真正想要使用PK2
和其他列表完成的内容(现在您填充它们但从不使用它们,所以我们可以完全优化它们,但可能是你以后用它们做了一些我们没有看到的东西。)
for frame in frames:
PK2=[]
E_pl=[]
E_tot=[]
for k in range(103,109):
b=frame.fieldOutputs['SDV'+str(k)]
PK2.append([v.data for v in b.values])
b=frame.fieldOutputs['SDV'+str(k+6)]
E_tot.append([v.data for v in b.values])
b=frame.fieldOutputs['SDV'+str(k+12)]
E_pl.append([v.data for v in b.values])
t3=time.time()
print stepName,"All PK,E terms written",t3-at,"Sec"
编辑:您现在已经告诉我们,您之后会这样做:
PK2=np.array(PK2)
你使用NumPy很棒,但你也可以从一开始就使用它:
def loadarray(frame, offset):
keys = range(103+offset, 109+offset)
valueslist = [frame.fieldOutputs['SDV'+str(key)].values for key in keys]
count = 0
for values in valueslist:
count += len(values)
arr = np.empty(count)
count = 0
for values in valueslist:
arr[count:count+len(values)] = values
count += len(values)
return arr.T
for frame in frames:
PK2 = loadarray(frame, 0)
E_tot = loadarray(frame, 6)
E_pl = loadarray(frame, 12)
现在我们已经避免创建临时列表了,我们有PK2
和其他数组的最终形式,转换并准备就绪。
答案 1 :(得分:1)
我认为你可以很难将其压入C:
Sdv_list = [ 'SDV'+str(k) for k in range(103,121)]
for frame in frames:
PK2=[]
E_pl=[]
E_tot=[]
aggs = [PK2]*6 + [E_tot]*6 + [E_pl]*6
values = [frame.fieldOutputs[key].values for key in Sdv_list]
for agg,val in zip(aggs, values):
agg.append([v.data for v in val])
t3=time.time()
print stepName,"All PK,E terms written",t3-at,"Sec"