gpt4 book ai didi

python - 我怎样才能并行化这个字数统计功能?

转载 作者:可可西里 更新时间:2023-11-01 14:19:35 28 4
gpt4 key购买 nike

我有一些像这样的序列代码来计算单词索引,即计算并置单词对。下面的程序可以工作,只是出于说明目的而对句子列表进行了压缩。

import sys
from collections import defaultdict

GLOBAL_CONCORDANCE = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: [])))

def BuildConcordance(sentences):
global GLOBAL_CONCORDANCE
for sentenceIndex, sentence in enumerate(sentences):
words = [word for word in sentence.split()]

for index, word in enumerate(words):
for i, collocate in enumerate(words[index:len(words)]):
GLOBAL_CONCORDANCE[word][collocate][i].append(sentenceIndex)

def main():
sentences = ["Sentence 1", "Sentence 2", "Sentence 3", "Sentence 4"]
BuildConcordance(sentences)
print GLOBAL_CONCORDANCE

if __name__ == "__main__":
main()

对我来说,第一个 for 循环可以并行化,因为计算的数字是独立的。但是,被修改的数据结构是全局的。

我尝试使用 Python 的 Pool 模块,但我遇到了一些 pickling 问题,这让我想知道我是否使用了正确的设计模式。有人可以建议并行化此代码的好方法吗?

最佳答案

通常,当您使用函数式风格时,多处理是最简单的。在这种情况下,我的建议是从辅助函数的每个实例返回一个结果元组列表。嵌套的 defaultdict 的额外复杂性实际上并没有给您带来任何好处。像这样:

import sys
from collections import defaultdict
from multiprocessing import Pool, Queue
import re

GLOBAL_CONCORDANCE = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

def concordance_worker(index_sentence):
sent_index, sentence = index_sentence
words = sentence.split()

return [(word, colo_word, colo_index, sent_index)
for i, word in enumerate(words)
for colo_index, colo_word in enumerate(words[i:])]

def build_concordance(sentences):
global GLOBAL_CONCORDANCE
pool = Pool(8)

results = pool.map(concordance_worker, enumerate(sentences))

for result in results:
for word, colo_word, colo_index, sent_index in result:
GLOBAL_CONCORDANCE[word][colo_word][colo_index].append(sent_index)

print len(GLOBAL_CONCORDANCE)


def main():
sentences = ["Sentence 1", "Sentence 2", "Sentence 3", "Sentence 4"]
build_concordance(sentences)

if __name__ == "__main__":
main()

如果这没有生成您要查找的内容,请告诉我。

关于python - 我怎样才能并行化这个字数统计功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016561/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com