2016-04-29 10 views
0

これはコードの一部であり、実行するたびに(1つのelに対して)約5分かかります。実行時間を短縮するために以下の助けが必要

フィールド値の長さは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

'frames'は何ですか?私たちが実行できる完全な作業プログラムを見せてくれれば非常に便利です。 –

+0

このデータはどのように生成されていますか?あなたがそれを変えることができるなら、あなたはかなりのスピードの改善を見るかもしれません。 'frames'データ構造体はあなたが変更できるものですか? –

+0

Abaqusとして知られている他の標準的な商用ソフトウェアからデータが問い合わせされます。私は構造を変更することはできないと思う。ありがとう! – Mechanician

答えて

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を持っており、それらの最終的なFO内の他の配列rm、移調して行く準備ができています。

+0

ありがとうジョン!私はこれを試してみて、戻ってみましょう! これは実際にはAbaqus-Pythonインタフェーススクリプトです。私はフレームがAbaqusで定義されたクラス構造全体の中のオブジェクトであると信じています。私はこのことができます場合は知らない \t \tフレーム=のmyOdb.steps [STEPNAME] .frames \t \t numFrames = LEN(フレーム)! – Mechanician

+0

@prithivirajanVeerappan:通常、 'frames'にいくつの要素がありますか? –

+0

numframesは11になります。 私が言ったように、フィールド値の長さは〜1e6なので、その6 * 3 * 1e6倍です! はい私はPK2でいくつかのことを達成しようとしていますが、それには数秒かかります。 – Mechanician

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" 
関連する問題