2016-10-16 8 views
0

Ich habe dies auf Python codiert. Es dauerte viel zu lange, bis die Eingabe nur 40x40 war (es ist für die Bildverarbeitung mit numpy). Sein Verhalten ist das Folgende: Es gibt ein Array mit Objekten darin (die ein "image" -Attribut haben, das ein numpy Array ist) und dann überprüfe ich, ob das Objekt irgendwo in einem anderen Array ist, und nehme dann das nächste vom ersten Array und wiederholen sie den Vorgang, bis ich, wenn alle in der anderen Reihe überprüft haben:Warum dauert die Ausführung dieses Codes so lange? - Python

#__sub_images is the array containing the objects to be compared 
    #to_compare_image is the image that is received as parameter to check if the objects are in there. 
    #get_sub_images() is just to retrieve the objects from the array from the received array to find. 
    #get_image() is the method that retrieves the attribute from the objects 
    same = True 
    rows_pixels = 40 #problem size 
    cols_pixels = 40 #problem size 
    i = 0 #row index to move the array containing the object that must be checked if exist 
    j = 0 #col index to move the array containing the object that must be checked if exist 
    k = 0 #row index to move the array where will be checked if the object exist 
    l = 0 #col index to move the array where will be checked if the object exist 

    while i < len(self.__sub_images) and k < len(to_compare_image.get_sub_images()) and l < len(to_compare_image.get_sub_images()[0]): 

      if not np.array_equal(self.__sub_images[i][j].get_image(), to_compare_image.get_sub_images()[k][l].get_image()): 
       same = False 
      else: 
       same = True 
       k = 0 
       l = 0 
       if j == len(self.__sub_images[0]) - 1: 
        j = 0 
        i += 1 
       else: 
        j += 1 

      if not same: 
       if l == len(to_compare_image.get_sub_images()[0]) - 1: 
        l = 0 
        k += 1 
       else: 
        l += 1 

ich es mit nur einem while, anstelle von 4 for-loops codieren verwaltet, das ist, was ich zu tun, bevor verwendet. Warum dauert es so lange noch? Ist das normal oder stimmt etwas nicht? Die Komplexität soll x sein und nicht x

Der Code, der nicht enthalten ist, sind nur Getters, ich hoffe, Sie können es mit dem #notes am Anfang verstehen.

THanks.

+0

Ich glaube nicht, dass "für" und "während" einen Unterschied macht. Können Sie versuchen, die 'while'-Anweisung durch vorberechnete Werte wie in diesem Beispiel hier zu ersetzen: https://eval.in/661185 Dies um Neuberechnungen von Listenlängen zu vermeiden. Sehen Sie, wie viel das hilft. – sal

+0

Es gibt einen großen Unterschied, wenn Sie 4 verschachtelte Schleifen (for) wie früher, 2 Schleifen pro 2D-Array verwendet haben. Die Komplexität wird x⁴, mit nur einer Weile ist es x. – Wrong

+0

Ok. Hat das, was ich vorgeschlagen habe, geholfen? Sollte nach dem "wenn nicht gleich" auch auf die Zeile angewendet werden. – sal

Antwort

-1

Statt dessen:

if not np.array_equal(self.__sub_images[i][j].get_image(), to_compare_image.get_sub_images()[k][l].get_image()): 
    same = False 
else: 
    same = True 
    #snip 
if not same: 
    #snip 

Sie können dies tun:

same=np.array_equal(self.__sub_images[i][j].get_image(), to_compare_image.get_sub_images()[k][l].get_image()) 
if same: 
    #snip 
else: 
    #snip 

Dies wird weniger, wenn Zweige als zuvor.

+0

Während besser Stil, ist dies eine triviale Veränderung; Es ist kein sinnvoller Bestandteil der Performance. Das Optimieren einer einfachen booleschen Überprüfung ist sinnlos, es sei denn, es ist der heißeste Teil des Codes (und das ist es nicht). – ShadowRanger

+0

Ich glaube nicht, nur ein If zu entfernen, wird es effizienter machen. Irgendeine Idee, warum es so lange dauert für eine Komplexität von 40+? – Wrong

Verwandte Themen