2017-02-04 1 views
0

Ich arbeite derzeit auf notMINST-Datenbank mit Python 2.7, versuchen, doppelte Bilder zu entfernen. Ich verwandle jedes Bild in MD5-Hash und erstellt ein Wörterbuch image_hashSchneller Algorithmus zum Entfernen von Duplikaten aus Wörterbüchern, vergleichen von zwei

Die erste Methode funktioniert, es dauerte jedoch fast eine Stunde für insgesamt 500000 Bilder im Datensatz.

image_hash_identical = {} 
for key,value in image_hash.items(): 
    if value not in image_hash_identical.values(): 
     image_hash_identical[key] = value 

Ich habe versucht, ‚set‘ Funktion zu verwenden, um eine zweite Methode zu schaffen Dinge schneller zu machen:

image_hash_set_values = list(set(image_hash.values())) 
for i in range(len(image_hash_set_values)): 
    for j in range(i, len(image_hash)): 
     image_hash[j] == image_hash_set_values[i]: 
      image_hash_identical[i] = image_hash[j] 
      break 

jedoch dieser Code konnte den Prozess für die ‚Set‘ Funktion beschleunigen schlurfte die Reihenfolge von image_hash. Gibt es irgendwelche Möglichkeiten, das Shuffling durch die 'set'-Funktion oder irgendwelche schnelleren Algorithmen zu verhindern, die mit dieser Situation umgehen können?

+0

Haben Sie versucht, den Aufbau '' 'image_hash''' mit dem Hash als Schlüssel? – wwii

+0

Nein, nicht als Schlüssel, sondern als Wert. Ich benutzte Schlüssel, um die ID von Observasion darzustellen – Xiuyuanc

Antwort

1

Warum halten nicht nur den Überblick über gesehen Werte einen Satz mit:

image_hash_identical, seen = {}, set() 
for key, value in image_hash.items(): 
    if value not in seen: # contains of set: O(1) 
     image_hash_identical[key] = value 
     seen.add(value) 
+0

Den Überblick über die gesehenen Werte zu behalten, konnte während des Aufbaus von '' image_hash''' gemacht werden. – wwii

+0

Sehr wahr, das gleiche Prinzip. Insbesondere, da Sie nicht die Reihenfolge der Iteration kontrollieren, ist es ziemlich zufällig, welcher Schlüssel bleibt. Aber Sie kontrollieren nicht immer die Daten, mit denen Sie umgehen ...: '( – schwobaseggl

+0

) Ist das der gleiche Weg wie beim ersten Algorithmus 'image_hash_identical.value()' funktioniert genauso wie 'seen'? – Xiuyuanc

Verwandte Themen