面试题答案
一键面试优化思路
- 使用多进程替代多线程:由于GIL的存在,多线程在CPU密集型任务中无法充分利用多核CPU的优势。而多进程每个进程有独立的Python解释器,不存在GIL限制,可以并行利用多核资源。
- 将任务分割:把复杂的数学运算任务拆分成多个子任务,分配给不同的进程并行处理,最后汇总结果。
具体实现方法
- 使用
multiprocessing
模块:这是Python标准库中用于多进程处理的模块。 - 示例代码:
import multiprocessing
def sub_task(data):
# 模拟复杂数学运算
result = 0
for num in data:
result += num * num
return result
if __name__ == '__main__':
data = list(range(1000000))
num_processes = multiprocessing.cpu_count()
chunk_size = len(data) // num_processes
chunks = [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)]
with multiprocessing.Pool(processes=num_processes) as pool:
results = pool.map(sub_task, chunks)
total_result = sum(results)
print(f"最终结果: {total_result}")
在上述代码中:
sub_task
函数模拟了复杂的数学运算,这里简单地对输入数据的每个元素求平方并累加。if __name__ == '__main__'
是在Windows系统下使用multiprocessing
模块的必要条件,在其他系统中也建议加上以确保代码的可移植性。- 将数据
data
按照CPU核心数分成多个chunks
,每个chunk
由一个进程处理。 - 使用
multiprocessing.Pool
创建进程池,并通过map
方法将子任务分配给进程池中的进程并行处理。 - 最后汇总每个子任务的结果得到最终结果。