【发布时间】:2015-03-23 17:54:28
【问题描述】:
我正在努力改善这段代码的执行时间。由于计算非常耗时,我认为最好的解决方案是并行化代码。 输出也可以存储在内存中,然后写入文件。
我对 Python 和并行性都是新手,所以我发现很难应用 here 和 here 解释的概念。我还发现了this 问题,但我无法弄清楚如何针对我的情况实施同样的问题。 我正在使用 Python 3.4 在 Windows 平台上工作。
for i in range(0, len(unique_words)):
max_similarity = 0
max_similarity_word = ""
for j in range(0, len(unique_words)):
if not i == j:
similarity = calculate_similarity(global_map[unique_words[i]], global_map[unique_words[j]])
if similarity > max_similarity:
max_similarity = similarity
max_similarity_word = unique_words[j]
file_co_occurring.write(
unique_words[i] + "\t" + max_similarity_word + "\t" + str(max_similarity) + "\n")
如果您需要对代码进行解释:
-
unique_words是单词列表(字符串) -
global_map是一个字典,其键是单词(global_map.keys()包含与unique_words相同的元素),值是以下格式的字典:{word: value},其中单词是 @ 中值的子集987654330@ - 对于每个单词,我会根据其在
global_map中的值查找最相似的单词。我不想将每个相似性都存储在内存中,因为地图已经占用了太多空间。 -
calculate_similarity返回一个从 0 到 1 的值 - 结果应该包含
unique_words中每个单词最相似的单词(最相似的单词应该与单词本身不同,这就是我添加条件if not i == j的原因,但是如果我检查max_similarity是否不同于 1) - 如果一个词的
max_similarity为0,那么如果最相似的词是空字符串就可以了
【问题讨论】:
-
我认为如果不将一些相似性值存储在内存中,您将无法并行运行该精确循环。你能描述一下代码的预期输出是什么吗?如果您正在寻找与集合中的 每个 单词最相似的单词,我认为不会这样做。
-
是的,它应该为每个单词找到最相似的单词。它也应该循环内循环中的所有单词,还是错误在其他地方?另外,如果您有将结果存储在内存中的解决方案,请发布它,我会找到一种方法来腾出一些空间。
-
我认为问题出在两个循环中。外部循环跳过最后一个单词,因此您不会找到最相似的单词。内部循环还需要查看所有单词。例如,除非我遗漏了某些内容,否则对于您当前的代码和单词列表 [a,b,c],其中 b 与 a 比与 c 更相似,您的输出将是:a 与 b 最相似(a 循环看到b),b 与 c 最相似(b 循环没有看到 a,所以它选择了 c)并且 c 没有输出。
-
你是对的。我刚刚编辑了这个问题,更好地解释了预期的输出,现在我将再次编辑它,如你所指的那样解决这个问题。谢谢。
-
不确定这是否适用于 Python 3,但这可能值得研究:stackoverflow.com/questions/2846653/…
标签: python parallel-processing multiprocessing python-multithreading python-multiprocessing