Ich habe vor kurzem ein Programm programmiert, das den kürzesten Weg zwischen zwei wikipedia Artikeln findet. Das Problem besteht darin, ALLE Links von einer Seite zu bekommen und sie in ein Diagramm zu schreiben, dauert sehr lange. Den Weg zu finden ist der einfache Teil. Basicly, was ich tue, ist dies:Wie man Programm beschleunigt, das den kürzesten Weg zwischen zwei wikipedia Artikeln findet
startingPage = 'Lisbon'
target = 'Adolf Hitler'
graph = nx.DiGraph()
graph.add_node(startingPage)
found = pages.import_page(graph, startingPage)
while found != True:
for node in list(graph):
if graph.out_degree(node) == 0:
found = pages.import_page(graph, node)
if found == True:
break;
Und meine import_page Funktion ist diese:
def import_page(graph, starting, target):
general_str = 'https://en.wikipedia.org/w/api.php?action=query&prop=links&pllimit=max&format=json&titles='
data_str = general_str + starting
encoded_data_str = data_str.encode('utf-8') #Sanitize input
response = url.urlopen(encoded_data_str)
data = json.loads(response.read())
pageId = data['query']['pages'].keys()
print starting
if data['query']['pages'].keys()[0] == '-1': #Check if the page doesn't exist in Wikipedia
return False
elif data['query']['pages'][pageId[0]].keys()[2] != 'links': #Check if the page has no links in it
return False
for jsonObject in data['query']['pages'][pageId[0]]['links']:
graph.add_node(jsonObject['title'])
graph.add_edge(starting, jsonObject['title'])
if jsonObject['title'] == target:
return True
while data.keys()[0] != 'batchcomplete':
continueId = data['continue']['plcontinue']
continue_str = data_str + '&plcontinue=' + continueId
encoded_continue_str = continue_str.encode('utf-8') #Sanitize input
response = url.urlopen(encoded_continue_str)
data = json.loads(response.read())
for jsonObject in data['query']['pages'][pageId[0]]['links']:
graph.add_node(jsonObject['title'])
graph.add_edge(starting, jsonObject['title'])
if jsonObject['title'] == target:
return True
return False
Das Problem für einen beliebigen Abstand ist größer als 2/3 Links ist eine Einnahme eine immense Zeitraum. Irgendwelche Ideen, wie ich es beschleunigen kann?
Warum Sie sich über die Kanten kümmern ? Wollen Sie nicht nur eine Liste aktiver Knoten und eine Liste der besuchten Knoten behalten? Ein weiteres Problem (das möglicherweise dadurch verursacht wird, dass ich die Grafikbibliothek nicht kenne): Ist es zulässig, das Diagramm zu ändern, während Sie über seine Knoten iterieren? –
Auch, wie es hier geschrieben ist, ist deine 'import_page' wirklich' import_Adolf_Hitler_page' :) –
Ja, ich habe das schon aktualisiert, hab vergessen hier zu updaten! –