Ich habe einen Datensatz, der ein großer ungewichteter zyklischer Graph ist. Die Zyklen treten in Schleifen von ungefähr 5-6 Pfaden auf. Es besteht aus ungefähr 8000 Knoten und jeder Knoten hat 1-6 (normalerweise 4-5) Verbindungen. Ich mache Single Pair Shortest Path-Berechnungen und habe den folgenden Code implementiert, um eine Breitensuche durchzuführen.Kann diese Breitensuche schneller gemacht werden?
from Queue import Queue
q = Queue()
parent = {}
fromNode = 'E1123'
toNode = 'A3455'
# path finding
q.put(fromNode)
parent[fromNode] = 'Root'
while not q.empty():
# get the next node and add its neighbours to queue
current = q.get()
for i in getNeighbours(current):
# note parent and only continue if not already visited
if i[0] not in parent:
parent[i[0]] = current
q.put(i[0])
# check if destination
if current == toNode:
print 'arrived at', toNode
break
Der obige Code verwendet die Python 2.6 Queue-Modul und getNeighbours() ist einfach eine Unterroutine, die einen einzelnen MySQL Anruf tätigt und gibt die Nachbarn als eine Liste von Tupeln z.B. (('foo',), ('bar',)). Der SQL-Aufruf ist schnell.
Der Code funktioniert ok Prüfung jedoch nach unten von etwa 7 Schichten bis in Tiefen dauert etwa 20 Sekunden (2,5 GHz Intel 4GB RAM OS X 10.6)
Ich würdelaufen begrüßen alle Kommentare darüber, wie den Lauf zu verbessern Zeit dieses Codes.
abgeordnet, 8000 Knoten werden leicht in den Speicher passen. –
Guter Anruf! Die Tabelle mit den Knoteninformationen ist einfach Zeilen von fromNode, toNode. Ich werde untersuchen, es einfach in den Speicher zu laden .. vielleicht nur eine große Dictionary-Struktur. – timbo
Als einfachen Test habe ich das MySQL in den Speicher geladen, indem ich einfach ENGINE = MEMORY für die CREATE TABLE-Definition verwende. Derselbe Code ist jetzt in etwa 2,5 Sekunden fertig! – timbo