Python多线程不会提高速度

时间:2019-03-13 08:27:00

标签: python multithreading pandas threadpool

我有2个单独的文件,其中包含一个地点的坐标,另一个文件包含街道和邮政编码。

通过使用pandas,我想通过使用唯一键映射所有三个参数来创建一个包含所有三个参数的新数据框。问题是它花费了太长时间。

这是通过唯一键映射它们的代码:

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 个答案:

答案 0 :(得分:3)

Python使用GIL(global interpreter lock),可防止多个线程一次执行Python字节码。换句话说,一次只能执行一个线程,因此在您的情况下几乎不可能实现任何显着的性能提升。

您应该尝试改用Python Multiprocessing Pool,不受GIL的限制:

from multiprocessing import Pool

...
pool = Pool(5)
company_items = pool.map(group_comp_with_coord, test.iterrows())
...
相关问题