我在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()
答案 0 :(得分:0)
你应该 在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方式。
答案 1 :(得分:0)
有一些简单的方法可以改进您的代码,但我不确定性能会发生多大变化。你之前做过一些浪费的事情,但我认为这不是很贵的东西。
最大的变化是避免使用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])