root_words = [set(f'word{i}')for i in range(10000)]
num_root_words = len(root_words)
def findsim(root_words):
pair_dict = collections.defaultdict(list)
for i, word_i in enumerate(root_words):
for j in range(i + 1, num_root_words):
word_j = root_words[j]
if len(word_i & word_j) > 3:
pair_dict[i].append(j)
return pair_dict
pairdict =findsim(root_words)有什么方法可以让这个函数运行得更快吗?
我尝试使用NumPy相关的优化,但仍然很慢,需要改善执行时间
1条答案
按热度按时间lnvxswe21#
这应该有助于你开始:您可以将每个不同的值分配给一个位,然后使用按位
&
,这比使用集合比较快得多。然后,您可以对每个元素进行向量化比较,并生成具有>3个共同元素的索引列表,而无需python循环。您可能希望使用与
3
不同的值来检查结果-所有项目都有共同的word
。在我的PC上,我看到了4.5倍的加速: