2016-06-24 11 views
0

Lassen Sie mich zuerst damit beginnen, indem ich sage, dass ich keine echte Erfahrung mit Multithreading habe. Dieses Skript, das ich geschrieben habe, liest ~ 4.400 Adressen aus einer Textdatei und bereinigt dann die Adresse und geocodiert es. Mein Bruder hat etwas über die Verwendung von Multithreading erwähnt, um die Geschwindigkeit zu erhöhen. Ich habe online gelesen, dass Multithreading keinen großen Unterschied macht, wenn Sie nur eine einzige Textdatei verwenden. Würde es funktionieren, wenn ich die einzelne Textdatei in 2 Textdateien aufspalte? Wie auch immer, ich würde es wirklich schätzen, wenn mir jemand zeigen könnte, wie man Multithreading oder Multiprocessing für dieses Skript implementiert, um die Geschwindigkeit zu erhöhen. Wenn es nicht möglich ist, könnten Sie mir sagen, warum? Vielen Dank!Implementieren Multithreading (oder Multiprozessing?) Mit diesem Skript?

from geopy.geocoders import Bing 
from geopy.exc import GeocoderTimedOut 
geolocator = Bing('vadrPcGdNLSX5bPNL7tw~ySbwhthllg7rNA4VSJ-O4g~Ag28cbu9Slxp5Sh_AsBDuQ9WypPuEhl9pHVPCAkiPf4A9FgCBf3l0KyQTKKsLCHw') 
import tkinter as tk 
from tkinter import filedialog 

root = tk.Tk() 
root.withdraw() 


def cleanAddress(dirty): 
    try: 
     clean = geolocator.geocode(dirty) 
     x = clean.address 
     address, city, zipcode, country = x.split(",") 
     address = address.lower() 
     if 'first' in address: 
      address = address.replace('first', '1st') 
     elif 'second' in address: 
      address = address.replace('second', '2nd') 
     elif 'third' in address: 
      address = address.replace('third', '3rd') 
     elif 'fourth' in address: 
      address = address.replace('fourth', '4th') 
     elif 'fifth' in address: 
      address = address.replace('fifth', '5th') 
     elif 'sixth' in address: 
      address = address.replace('ave', '') 
      address = address.replace('avenue', '') 
      address = address.replace('sixth', 'avenue of the americas') 
     elif '6th' in address: 
      address = address.replace('ave', '') 
      address = address.replace('avenue', '') 
      address = address.replace('6th', 'avenue of the americas') 
     elif 'seventh' in address: 
      address = address.replace('seventh', '7th') 
     elif 'fashion' in address: 
      address = address.replace('fashion', '7th') 
     elif 'eighth' in address: 
      address = address.replace('eighth', '8th') 
     elif 'ninth' in address: 
      address = address.replace('ninth', '9th') 
     elif 'tenth' in address: 
      address = address.replace('tenth', '10th') 
     elif 'eleventh' in address: 
      address = address.replace('eleventh', '11th') 
     zipcode = zipcode[3:] 
     print(address + ",", zipcode.lstrip() + ",", str(clean.latitude) + ",", str(clean.longitude)) 
    except AttributeError: 
     print('Can not be cleaned') 
    except ValueError: 
     print('Can not be cleaned') 
    except GeocoderTimedOut as e: 
     print('Can not be cleaned')   


def main(): 
    root.update() 
    fpath = filedialog.askopenfilename() 
    f = open(fpath) 
    for line in f: 
     dirty = line + " nyc" 
     cleanAddress(dirty) 
    f.close() 

if __name__ == '__main__': 
    main() 

Antwort

0

Kurze Antwort ist: Nein, Sie können nicht.

Python multiprocessing Bibliothek ermöglicht es Ihnen, die Zeit für alle Berechnungen zu reduzieren, indem Sie sie über mehrere Prozesse verteilen. Es kann den gesamten Lauf Ihres Skripts beschleunigen, aber nur, wenn für die CPU viel zu berechnen ist.

In Ihrem Beispiel die meiste Zeit nimmt Verbindung zu Web-Services, die geo-location Zeug für Sie ausführen, so hängt die gesamte Ausführungszeit eher von Ihrem oder Service-Internetverbindung Geschwindigkeit, dass Ihr Computer insgesamt.

+0

Vielen Dank für die Erklärung. Dieser Code benötigt ungefähr 45 Minuten, um die Textdatei vollständig auszuführen, aber das ist der Zeitpunkt, an dem ich ein iPhone als drahtlosen Hotspot benutze (das Arbeitsnetzwerk erlaubt Python derzeit keine externen Verbindungen mit Bibliotheken, aber das wird es sein) bald behoben). Haben Sie eine Idee, wie viel schneller dieses Programm auf einer Internetverbindung mit durchschnittlicher Geschwindigkeit wäre? – Harrison

+0

Beste "Danke", die ich bekommen kann, ist upvote meiner Antwort und überprüfen Sie Frage als beantwortet. Ich kann Ihnen nicht sagen, wie viel schneller dieses Programm bei einer durchschnittlichen Internetverbindungsgeschwindigkeit wäre, weil ich keine Ahnung habe, was "durchschnittliche" Geschwindigkeit ist und ob "entfernte Geo-Lokalisierungsdienste" dies besser handhaben können als jetzt. –

+0

Das mag eine blöde Frage sein, aber würde es funktionieren, wenn ich die Textdatei in 2 Teile zerlege und 2 Instanzen von Python öffne und das Programm auf jeder Hälfte zur gleichen Zeit ablaufen lasse? – Harrison