Возможно, код медленный из-за задержки в сети при многократном нажатии OpenCageGeocode
. Параллелизм может помочь с операциями ввода / вывода (в вашем случае выборка координат из удаленного API).
То, что я сделал, это поместил код, который выбирает координаты в функцию, затем выполнил эту функцию со всеми возможными состояниями в пул потоков из 5 работников:
import concurrent.futures
key = 'API KEY' # get Your api key from: https://opencagedata.com
geocoder = OpenCageGeocode(key)
list_lat = []
list_long = []
def load_coords(row):
query = str(row['city_ascii'])
results = geocoder.geocode(query)
lat = results[0]['geometry']['lat1']
long = results[0]['geometry']['lng1']
return (lat, long)
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
results = executor.map(load_coords, (row for _, row in df.iterrows()))
for coords in results:
list_lat.append(coords[0])
list_long.append(coords[1])
Количество работников определяет, сколько запросов выполняется одновременно, поэтому ваш код будет примерно в пять раз быстрее.
Примечание : Этот код может не работать, потому что у меня нет ключа API для его проверки, а также я удалил обработку ошибок для простоты.
Обновление: Код отредактирован.