为何Python版IDF计算远慢于PySpark?求性能优化方案
IDF计算性能优化问题与解决方案
我在计算IDF值时,发现自行编写的Python代码运行速度远慢于PySpark实现——我的代码需2小时以上,PySpark仅需数秒。我知道PySpark基于Java,但性能差异似乎远超Python与Java的语言本身差距。
我的实现函数如下:
import math from tqdm import tqdm def calc_idf(data, terms): # data is a list of lists filled with tokenized data # terms is a list of the tokens to calculate IDF values num_docs = len(data) idf_values = [] for term in tqdm(terms, desc="IDF", position=0, leave=True): idf_val = 0 for doc in data: if term in doc: idf_val += 1 idf_values.append(math.log2((num_docs+1)/(idf_val+1))) # Using base 2 as original paper did return idf_values
我使用的IDF定义来自Spark官方文档,现寻求提升该IDF计算代码速度的建议。
编辑1:正如Jerome评论中提到的,data中的每个doc确实是列表。将doc转换为set后,速度提升了约68倍!感谢建议!
编辑2:我意识到将列表转为set不可行,因为set无法存储重复值,因此必须使用multiset包中的Multiset。
内容的提问来源于stack exchange,提问作者Caden
相关产品推荐
相关产品推荐

