需要以下帮助以减少执行时间

时间:2016-04-29 03:19:24

标签: python abaqus

这只是代码的一部分,每次迭代(单个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) 

提前致谢!

2 个答案:

答案 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"