2015-09-02 2 views
1

Я написал простой код в ABAQUS PDE для экспорта результатов в файлы csv. Я включил его здесь, и мне интересно, как я могу повысить его эффективность.Как повысить эффективность этого кода Python

Я так ценен за ваши ценные комментарии.

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

Вы намеренно омываете последний шаг? – Blckknght

+0

Портируйте его в Фортран. – erip

+0

Прежде чем делать что-либо вроде переноса его на другой язык, выполните профилирование. Например, с помощью lineprofiler: http://www.huyng.com/posts/python-performance-analysis/ – Moritz

ответ

0

Нечто, что вы должны не использование в питона:

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.

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])