mein erstes Cython Programm ist nicht nennenswert schneller als das, was ich von Python (numnpy) kenne. Folgendes habe ich entsprechend der Tutorials gemacht:
- Typen definiert
- bei Funktionsaufruf typen übergeben für effizientes Indexing
- bounds checking ausgeschaltet
Ich habe einige Schleifen drin wie:
Code: Alles auswählen
...
cdef unsigned int indexMinimumZerosColumn
cdef unsigned int rowIndex = 0
cdef unsigned int columnIndex = 0
cdef numpy.ndarray coverRows = numpy.zeros([matrixSize], dtype=numpy.int32)
cdef numpy.ndarray numberOfRowZeros = numpy.zeros([matrixSize], dtype=numpy.int32)
cdef numpy.ndarray matrixSizeVector = numpy.arange(matrixSize, dtype = numpy.int32)
...
for rowIndex in matrixSizeVector:
if searchMatrix[rowIndex,indexMinimumZerosColumn] == 0:
coverRows[rowIndex] = 1
numberOfRowZeros[rowIndex] =0
for columnIndex in matrixSizeVector:
if searchMatrix[rowIndex,columnIndex] == 0:
searchMatrix[rowIndex,columnIndex] = 1
Vielen Dank für eure Hilfe. Optimal wäre es, wenn mal jemand über die angehängte Datei drüberschauen könnte (kann man das hier nicht? - dann hänge ich den Code der Funktion halt direkt hier an). Besonders die Funktion "getMinimalCover" ist kritisch, weil sie einige male aufgerufen wird und ca 90% der Gesamtbearbeitungszeit frisst.
VG
Code: Alles auswählen
@cython.boundscheck(False) # turn of bounds-checking for entire function
def getMinimalCover(numpy.ndarray[DTYPE_t, ndim=2] inputMatrix not None, numpy.ndarray[numpy.int32_t, ndim=2] assignmentMatrix not None):
cdef numpy.ndarray searchMatrix = numpy.copy(inputMatrix)
cdef unsigned int matrixSize = searchMatrix.shape[0]
cdef numpy.ndarray matrixSizeVector = numpy.arange(matrixSize, dtype = numpy.int32)
cdef numpy.ndarray numberOfRowZeros = numpy.zeros([matrixSize], dtype=numpy.int32)
cdef numpy.ndarray numberOfColumnZeros = numpy.zeros([matrixSize], dtype=numpy.int32)
cdef numpy.ndarray coverRows = numpy.zeros([matrixSize], dtype=numpy.int32)
cdef numpy.ndarray coverColumns = numpy.zeros([matrixSize], dtype=numpy.int32)
cdef unsigned int rowIndex = 0
cdef unsigned int columnIndex = 0
cdef unsigned int noZeros = 0
cdef unsigned int index
cdef unsigned int element
cdef unsigned int currentMinimum
cdef unsigned int indexMinimumZerosRow
cdef unsigned int indexMinimumZerosColumn
cdef unsigned int minimumZerosRow
cdef unsigned int minimumZerosColumn
for rowIndex in matrixSizeVector:
noZeros = 0
for columnIndex in matrixSizeVector:
if searchMatrix[rowIndex, columnIndex] == 0:
noZeros +=1
numberOfRowZeros[rowIndex] = noZeros
for columnIndex in matrixSizeVector:
noZeros = 0
for rowIndex in matrixSizeVector:
if searchMatrix[rowIndex, columnIndex] == 0:
noZeros +=1
numberOfColumnZeros[columnIndex] = noZeros
while 1:
index = 0
currentMinimum = 1000
for element in numberOfRowZeros:
if element > 0 and element < currentMinimum:
currentMinimum = element
indexMinimumZerosRow = index
index +=1
minimumZerosRow = currentMinimum
if currentMinimum == 1000:
break
index = 0
currentMinimum = 1000
for element in numberOfColumnZeros:
if element > 0 and element < currentMinimum:
currentMinimum = element
indexMinimumZerosColumn = index
index +=1
minimumZerosColumn = currentMinimum
if minimumZerosRow <= minimumZerosColumn:
for columnIndex in matrixSizeVector:
if searchMatrix[indexMinimumZerosRow,columnIndex] == 0:
coverColumns[columnIndex] = 1
numberOfColumnZeros[columnIndex] =0
for rowIndex in matrixSizeVector:
if searchMatrix[rowIndex,columnIndex] == 0:
searchMatrix[rowIndex,columnIndex] = 1
numberOfRowZeros[rowIndex] -=1
else:
for rowIndex in matrixSizeVector:
if searchMatrix[rowIndex,indexMinimumZerosColumn] == 0:
coverRows[rowIndex] = 1
numberOfRowZeros[rowIndex] =0
for columnIndex in matrixSizeVector:
if searchMatrix[rowIndex,columnIndex] == 0:
searchMatrix[rowIndex,columnIndex] = 1
numberOfColumnZeros[columnIndex] -=1
return coverRows, coverColumns