You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python multiprocessing计算数字列表最大值并修复返回0的问题

问题根因

Python 的 multiprocessing 多进程模型中,每个子进程都会独立复制一份主进程的内存数据,子进程对全局变量的修改仅作用于自身的内存副本,无法同步到主进程,因此你最终打印的还是主进程中初始为0的greatest变量。
另外你当前的写法把单个元素作为pool.map的参数,会产生极高的进程调度开销,性能甚至会比串行计算差很多。

如果你尝试用共享内存变量配合锁的方式解决这个问题,会因为每次数值比较都要加锁,导致性能远低于串行计算,完全失去多进程的优势,因此不推荐这种方案。

高性能修复方案

采用分块计算+结果聚合的思路,既避免共享变量的同步开销,又最大化利用多进程性能:

  1. 先把大列表切割为和进程数匹配的数据块
  2. 每个子进程计算单个数据块的最大值并返回
  3. 主进程聚合所有子进程的返回结果,计算得到全局最大值

完整实现代码

from multiprocessing import Pool
import time
import random

# 生成随机列表
def generate_random_list():
    randomlist = []
    for i in range(100000000):
        n = random.randint(1,30000000)
        randomlist.append(n)
    return randomlist

# 计算单个数据块的最大值
def get_chunk_max(chunk):
    chunk_max = 0
    for num in chunk:
        if num > chunk_max:
            chunk_max = num
    return chunk_max

if __name__ == "__main__":
    randomlist = generate_random_list()
    process_num = 4 # 可根据自身CPU核心数调整
    
    # 切割列表为对应数量的数据块
    chunk_size = len(randomlist) // process_num
    chunks = [randomlist[i*chunk_size : (i+1)*chunk_size] for i in range(process_num)]
    # 补充最后不足一块的剩余元素
    if len(randomlist) % process_num != 0:
        chunks[-1].extend(randomlist[process_num*chunk_size:])
    
    t1 = time.time()
    with Pool(processes=process_num) as p:
        # 每个进程处理一个数据块
        chunk_max_list = p.map(get_chunk_max, chunks)
    # 聚合所有块的最大值得到全局结果
    global_max = max(chunk_max_list)
    print("pool took:", time.time()-t1)
    print("greatest = ", global_max)
性能说明
  • 避免了共享变量的锁开销,进程间仅需要传递少量的最大值结果,通信成本极低
  • 每个子进程处理大块连续数据,进程调度开销远小于逐个元素提交的写法
  • 实际运行速度会远快于串行实现,CPU核心数越多性能提升越明显

内容的提问来源于stack exchange,提问作者AKMalkadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:54:07