我创建了一个巨大的张量,数百万的字三元组及其计数。例如,一个字三联是一个(word0, link, word1)
。这些字三元组收集在单个字典中,其值是它们各自的计数,例如, (word0, link, word1): 15
。想象一下,我有几百万这样的三元组。在我计算出现之后,我尝试做其他计算,这是我的Python脚本卡住的地方。下面是代码的一部分,这需要永恒:Python熊猫张量访问非常缓慢
big_tuple = covert_to_tuple(big_dict)
pdf = pd.DataFrame.from_records(big_tuple)
pdf.columns = ['word0', 'link', 'word1', 'counts']
total_cnts = pdf.counts.sum()
for _, row in pdf.iterrows():
w0, link, w1 = row['word0'], row['link'], row['word1']
w0w1_link = row.counts
# very slow
w0_link = pdf[(pdf.word0 == w0) & (pdf.link == link)]['counts'].sum()
w1_link = pdf[(pdf.word1 == w1) & (pdf.link == link)]['counts'].sum()
p_w0w1_link = w0w1_link/total_cnts
p_w0_link = w0_link/total_cnts
p_w1_link = w1_link/total_cnts
new_score = log(p_w0w1_link/(p_w0_link * p_w1_link))
big_dict[(w0, link, w1)] = new_score
我异型我的剧本,似乎下面
w0_link = pdf[(pdf.word0 == w0) & (pdf.link == link)]['counts'].sum()
w1_link = pdf[(pdf.word1 == w1) & (pdf.link == link)]['counts'].sum()
两条线走49%和49%的计算时间%的每。这些行试图找到(word0, link)
和(word1, link)
的计数。所以,看起来像pdf像这样访问需要很多时间?我可以做些什么来优化它吗?
请检查我的更新答案 - 我想理解为什么new_score的表达不正确。 – knagaev
啊,是的,你说得对。数学... :) – minerals
正是:)消除计算开销。 – knagaev