My script is taking 12 hours+ any suggestions?
Andreas Neudecker
a.neudecker at uni-bonn.de
Mon Sep 1 08:26:16 EDT 2003
Hi, even if you find ways to speed up the code through editing, you
might want to try out Psyco: http://psyco.sourceforge.net/ . I have
tried it recently and it speeds up execution considerably.
Regards
Andreas
Ideasman wrote:
> Hi I have a made a script that process normals for a flat shaded 3D mesh's.
> It compares every vert with every other vert to look for verts that can
> share normals and It takes ages.
>
> I'm not asking anyone to rewrite the script- just have a look for any
> stupid errors that might be sucking up time.
>
>
>
>
>
>
>
>
> #!/usr/bin/python
> ##############
> # AUTOSMOOTH #
> ##############
> import sys
> import os
> import string
> import math
>
> # Used to write floats that dont' contain letters/
> def saneFloat(float):
> #return '%(float)b' % vars() # 6 fp as house.hqx
> return '%f' % float # 10 fp
>
>
>
> #Open file from the command line, turn into a list and close it.
> file = open(sys.argv[-1], 'r')
> fileLineList = file.readlines()
> file.close
>
> # Remember the number of lines for progress indication.
> fileLen = len(fileLineList)
>
> # Autosmooth value. Higher will autosmooth larger angles.
> maxDiff = 1.66
>
> # Loop through the lines.
> lineIndex = 0
> while lineIndex < len(fileLineList):
>
> #Find Geom TAG..
> if str(fileLineList[lineIndex])[0:8] == 'Geometry':
> lineIndex += 1
> # break if looping beyong the file,
> if lineIndex > len(fileLineList):
> break
>
> # Here we remember lines that have been processed.
> # it needs to be reset for each geom object.
> listOfDoneLines = []
>
> # Start a new loop that checks the current vert against all the
> others
> newLoopindex = lineIndex
> while len(string.split(fileLineList[newLoopindex])) == 12:
> print '\n', fileLen, newLoopindex,
>
> #vertexnum = newLoopindex - lineIndex
>
> # Compare the 2 lines
> newCompareLoopindex = newLoopindex + 1 # compare the current
> vert to this new one.
> thisPassDoneLines = [] # act apon this after comparing with
> each vert
> thisPassDoneNormals = []
> while len(string.split(fileLineList[newCompareLoopindex]))
> == 12:
>
> # Speed up the process by using 2 if's, splitting the
> string only if it has not been evaluated already.
> if newCompareLoopindex not in listOfDoneLines:
> comp1 = string.split(fileLineList[newLoopindex])
> comp2 = string.split(fileLineList[newCompareLoopindex])
>
> if [comp1[0], comp1[1], comp1[2]] == [comp2[0],
> comp2[1], comp2[2]]:
>
> if newLoopindex not in listOfDoneLines: # Only
> needs to be added once
> listOfDoneLines.append(newLoopindex)
>
> if newLoopindex not in thisPassDoneLines: # Only
> needs to be added once
> thisPassDoneLines.append(newLoopindex)
> thisPassDoneNormals.append([eval(comp1[8]),
> eval(comp1[9]), eval(comp1[10])])
>
> listOfDoneLines.append(newCompareLoopindex)
> thisPassDoneLines.append(newCompareLoopindex)
> thisPassDoneNormals.append([eval(comp2[8]),
> eval(comp2[9]), eval(comp2[10])])
> print '#',
>
> newCompareLoopindex += 1
>
>
>
> if len(thisPassDoneLines) > 1: # Ok We have some verts to
> smooth.
>
>
> # This loops through all verts and assigns each a new
> normal.
> for tempLineIndex in thisPassDoneLines:
>
> tempSplitLine =
> string.split(fileLineList[tempLineIndex])
>
> # We add to these for every vert that is similar,
> then devide them to get an average.
> NormX = 0
> NormY = 0
> NormZ = 0
>
> # A list of vert line indicies that we will create
> to store verts that have normals close to ours.
> thisVertFrendsCount = 0
>
> # This compares the current vert with all the
> others, if they are close then add to vertFrends.
> for tNorm in thisPassDoneNormals: # tNorm is just
> used for one of the normals in the thisPassDoneNormals
>
> if abs(eval(tempSplitLine[8]) - tNorm[0]) +
> abs(eval(tempSplitLine[9]) - tNorm[1]) + abs(eval(tempSplitLine[10])
> -tNorm[2])< maxDiff:
>
> #maxDiff
> NormX += tNorm[0]
> NormY += tNorm[1]
> NormZ += tNorm[2]
>
> thisVertFrendsCount += 1
>
>
> #Now devide the normals by the number of frends.
> NormX /= thisVertFrendsCount
> NormY /= thisVertFrendsCount
> NormZ /= thisVertFrendsCount
>
> # make unit length vector.
> d = NormX*NormX + NormY*NormY + NormZ*NormZ
> if d>0:
> d = math.sqrt(d)
> NormX/=d; NormY/=d; NormZ/=d
>
>
> # Write the normal to the current line
> tempSplitLine[8] = str(saneFloat(NormX))
> tempSplitLine[9] = str(saneFloat(NormY))
> tempSplitLine[10] =
> str(saneFloat(NormZ))
>
> fileLineList[tempLineIndex] =
> string.join(tempSplitLine) + '\n'
>
>
>
> newLoopindex += 1
>
> lineIndex += 1
>
>
> # Writing to file
> # file to write
> file = open(sys.argv[-1], 'w')
> file.writelines(fileLineList)
> file.close()
>
More information about the Python-list
mailing list