Реализовать многопоточность (или многопроцессорность?) С помощью этого скрипта?
Позвольте мне сначала начать с того, что я не имею реального опыта работы с многопоточностью. Этот сценарий, который я написал, читает ~4400 адресов из текстового файла, а затем очищает адрес и геокодирует его. Мой брат упомянул кое-что об использовании многопоточности, чтобы улучшить скорость. Я читал в Интернете, что многопоточность не имеет большого значения, если вы используете только один текстовый файл. Будет ли это работать, если я разделю один текстовый файл на 2 текстовых файла? В любом случае, я был бы очень признателен, если бы кто-нибудь показал мне, как реализовать многопоточность или многопроцессорность для этого скрипта для увеличения скорости. Если это невозможно, подскажите почему? Спасибо!
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()
1 ответ
Краткий ответ: нет, вы не можете.
питон multiprocessing
Библиотека позволяет сократить время, необходимое для выполнения всех расчетов, распределяя их по нескольким процессам. Это может ускорить весь запуск вашего скрипта, но только тогда, когда есть много, чтобы рассчитать для процессора.
В вашем примере большую часть времени занимает подключение к веб-службам, которые выполняют гео-локализацию для вас, поэтому общее время выполнения зависит скорее от скорости вашего соединения или скорости интернет-соединения, а не от вашего компьютера в целом.