Многопоточность Python не увеличивает скорость - PullRequest
2 голосов
/ 13 марта 2019

У меня есть 2 отдельных файла, которые содержат координаты места, а другой - улицу и почтовый индекс.

Используя pandas, я хочу создать новый Dataframe, содержащий все три параметра, сопоставив их с уникальным ключом. Проблема в том, что это занимает слишком много времени.

Это код для сопоставления их по уникальному ключу:

def group_comp_with_coord(comp_coord):
    comp_dict = comp_coord[1].to_dict()
    index = comp_coord[0]
    comp_dict.pop('Unnamed: 0', None)
    if index % 10000 == 0:
        print(index)
    comp = companies[(companies.uen == comp_dict['uen'])]
    comp_dict['reg_street_name'] = comp['reg_street_name'].item()
    comp_dict['reg_postal_code'] = comp['reg_postal_code'].item()
    return comp_dict

Это многопоточный код:

s = time.time()
test = companies_coordinates.head(100)
pool = ThredPool(5)
company_items = pool.map(group_comp_with_coord, test.iterrows())
pool.close()
pool.join()
df = pd.DataFrame(company_items)
df.to_csv('singapore_companies_coordinates_v2.csv', sep=',', encoding='utf-8')
print('Passed', time.time() - s)

Проблема здесь в том, что даже если не имеет значения, сколько потоков я отдаю ThreadPool, он всегда создает файл за 6 секунд со 100 строками данных.

Как мне увеличить скорость?

1 Ответ

3 голосов
/ 13 марта 2019

Python использует GIL ( глобальная блокировка интерпретатора ), он не позволяет нескольким потокам одновременно выполнять байт-коды Python.Другими словами, одновременно выполняется только один поток, поэтому практически невозможно добиться какого-либо значительного увеличения производительности в вашем случае.

Вместо этого вы должны попытаться использовать Python Multiprocessing Pool , которыйне ограничен GIL:

from multiprocessing import Pool

...
pool = Pool(5)
company_items = pool.map(group_comp_with_coord, test.iterrows())
...
...