使用Python的 multiprocessing 模块实现多进程并行计算的较为详细复杂的示例代码,用于计算一个较大范围内数字的平方,并将结果汇总。以下是一个更具体、复杂且详尽的多进程并行计算代码示例,用于分析多个大型文本文件中单词出现的频率:
import multiprocessing
import time
import re
from collections import Counter
# 函数用于读取单个文件内容并清洗,提取单词
def read_and_clean_file(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
# 使用正则表达式去除标点符号和数字,将文本转换为小写,并分割成单词列表
words = re.findall(r'\b\w+\b', text.lower())
return words
except Exception as e:
print(f"读取文件 {file_path} 时出错: {e}")
return []
# 函数用于计算单个文件中单词的频率
def calculate_word_frequency(words):
time.sleep(2) # 模拟每个文件的处理耗时,可能是复杂计算或大量数据处理导致
return Counter(words)
if __name__ == '__main__':
# 假设我们有多个大型文本文件要分析
file_paths = ['file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', 'file5.txt']
# 创建进程池,根据 CPU 核心数设置进程数量,这里假设为 4 个进程
pool = multiprocessing.Pool(processes=4)
# 第一步:并行读取和清洗文件,得到每个文件的单词列表
word_lists = pool.map(read_and_clean_file, file_paths)
# 第二步:并行计算每个单词列表的单词频率
word_frequencies = pool.map(calculate_word_frequency, word_lists)
# 关闭进程池,不再接受新任务
pool.close()
# 等待所有进程完成任务
pool.join()
# 合并所有文件的单词频率结果
total_frequency = Counter()
for freq in word_frequencies:
total_frequency += freq
# 打印出总的单词频率统计结果
print("单词频率统计结果:")
for word, count in total_frequency.most_common():
print(f"{word}: {count}")
以下是对上述代码的详细解释:
导入必要模块
import multiprocessing
import time
import re
from collections import Counter
- multiprocessing :用于创建多进程和进程池,实现并行计算。
- time :用于在函数中模拟处理耗时,以便更好地观察多进程的效果。
- re :正则表达式模块,用于清洗文本数据,提取单词。
- Counter :用于方便地统计单词出现的频率。
读取和清洗文件函数
def read_and_clean_file(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
# 使用正则表达式去除标点符号和数字,将文本转换为小写,并分割成单词列表
words = re.findall(r'\b\w+\b', text.lower())
return words
except Exception as e:
print(f"读取文件 {file_path} 时出错: {e}")
return []
这个函数接受一个文件路径作为参数,尝试打开文件并读取其内容。然后使用正则表达式 r'\b\w+\b' 提取所有的单词(去除标点符号和数字),并将文本转换为小写。最后返回提取出的单词列表,如果在读取文件过程中出现错误,则打印错误信息并返回空列表。
计算单词频率函数
def calculate_word_frequency(words):
time.sleep(2) # 模拟每个文件的处理耗时,可能是复杂计算或大量数据处理导致
return Counter(words)
该函数接受一个单词列表作为参数,使用 Counter 类统计每个单词在列表中的出现频率。这里使用 time.sleep(2) 模拟每个文件处理可能需要的时间,比如可能存在复杂的单词分析或大量单词数据导致处理时间较长。
主程序部分
if __name__ == '__main__':
# 假设我们有多个大型文本文件要分析
file_paths = ['file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', 'file5.txt']
在主程序中,首先定义了要分析的多个文本文件的路径列表。
# 创建进程池,根据 CPU 核心数设置进程数量,这里假设为 4 个进程
pool = multiprocessing.Pool(processes=4)
创建一个进程池,指定有 4 个进程。可根据实际计算机的 CPU 核心数量调整进程数量以优化性能。
# 第一步:并行读取和清洗文件,得到每个文件的单词列表
word_lists = pool.map(read_and_clean_file, file_paths)
使用进程池的 map 方法,并行地对每个文件路径调用 read_and_clean_file 函数,读取并清洗文件内容,得到每个文件对应的单词列表。
# 第二步:并行计算每个单词列表的单词频率
word_frequencies = pool.map(calculate_word_fication, word_lists)
接着再次使用 map 方法,并行地对每个单词列表调用 calculate_word_frequency 函数,计算每个文件中单词的频率,得到每个文件的单词频率统计结果列表。
# 关闭进程池,不再接受新任务
pool.close()
关闭进程池,防止后续意外地添加新任务。
# 等待所有进程完成任务
pool.join()
等待进程池中所有进程完成任务,确保所有的文件读取、清洗和单词频率计算都已完成。
# 合并所有文件的单词频率结果
total_frequency = Counter()
for freq in word_frequencies:
total_frequency += freq
将每个文件的单词频率统计结果合并为一个总的单词频率统计结果,使用 Counter 的加法操作来实现。
# 打印出总的单词频率统计结果
print("单词频率统计结果:")
for word, count in total_frequency.most_common():
print(f"{word}: {count}")
最后,打印出总的单词频率统计结果,按照单词出现频率从高到低的顺序输出每个单词及其出现的次数。
通过这个示例,可以看到如何利用多进程并行计算高效地处理多个大型文本文件的单词频率分析任务,提高处理效率,尤其是在处理大量数据或复杂计算时,多进程的优势更为明显。