这是我的代码:
import pandas as pd
from nltk.corpus import wordnet
df = pd.DataFrame({'col_1': ['desk', 'apple', 'run']})
df['synset'] = df.col_1.apply(lambda x: wordnet.synsets(x))
上面的代码在4核心PC上以16 GB ram运行相当慢。我希望加速并在具有24核和120 GB内存的Google Cloud实例上运行它。并且仍然运行缓慢(可能是以前的两倍)。谷歌控制台显示只使用了4.1核心。
所以我很好奇:Pandas是否并行运行每一行的计算?如果确实如此,那么我猜这里nltk
是一个瓶颈。任何人都可以确认或纠正我的猜测吗?
P.S。上面的代码只是一个示例,真正的数据帧有100k行。
答案 0 :(得分:1)
pandas没有并行化申请。您应该定义一个在每一行而不是lambda函数上运行的自定义函数,然后使用multiprocessing
来处理它并与您的数据帧重新同步。
def my_func(i):
#some work with i as index
return (i,result)
from multiprocessing import Pool
pool = Pool(24)
res=pool.imap(my_func,df.index)
for t in res:
df.set_value(t[0],"New column",t[1])