[英]how to improve efficiency of this Python code
我在ABAQUS PDE中編寫了一個簡單的代碼,將結果導出到csv文件。 我把它的一部分放在這里,我想知道如何提高它的效率。
非常感謝您的寶貴意見。
from odbAccess import *
from abaqusConstants import *
outputname='job-23.odb'
odb=openOdb(outputname)
myAssembly=odb.rootAssembly
% Defining number of elements
nofl=46
s1=open('s1.csv','w')
%Defining lenght of steps
lengthsteps=len(odb.steps.keys())
for j in range(nofl):
for i in range(lengthsteps-1):
step=odb.steps.keys()[i]
s=odb.steps[step]
jj=odb.steps[opstep].historyRegions.keys()[j]
sdata=s.historyRegions[jj].historyOutputs['S11'].data
l=len(sdata)
for k in range(l-1):
s1.write('%10.4E\n' % sdata[k][1])
s1.close()
你不應該在Python中使用的東西是:
objectNr = len(myObjects)
for i in range(objectNr-1):
a = myObjects[i]
print a
這樣的事情會更好:
for myObject in myObjects:
print myObject
在您的情況下,遍歷odb.steps可能會更容易。
for step in odb.steps:
s=odb.steps[step]
...
短得多好讀,這是python方式。
有一些簡單的方法可以改善您的代碼,但是我不確定性能會發生多少變化。 您以前做過一些浪費的工作,但我認為這不是非常昂貴的工作。
最大的變化是避免使用keys()
調用和整數索引來獲取字典鍵。 相反,我們只是直接訪問values()
。 由於您當前的代碼寫出交錯的數據(例如,按步驟分組,而不是按項目分組),因此我們將具有的嵌套結構(生成器表達式中的列表)與zip(*(...))
。
with open('s1.csv','w') as s1:
for item in zip(*(step.historyRegions.values() for step in steps.values()[:-1]))
for step in item:
for data in step:
s1.write('%10.4E\n' % data[1])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.