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

如何高效分组(i,j,value)对?寻求更优及易并行方案

高效分组与并行化解决方案

针对大量(i,j,value)元素的分组需求,这里提供几个比现有方法更高效、更易并行化的方案:

1. 使用collections.defaultdict直接分组

直接以元组(i,j)为键,用defaultdict(list)完成分组,避免嵌套列表的初始化开销和频繁索引操作,代码简洁且速度更优:

from collections import defaultdict

grouped = defaultdict(list)
for i, j, val in value_list:
    grouped[(i, j)].append(val)

若后续需要转回嵌套列表格式,可遍历分组结果填充:

sorted_list = [[[] for _ in range(n)] for _ in range(m)]
for (i, j), vals in grouped.items():
    sorted_list[i][j] = vals

2. 基于Numpy的矢量化分组(适合大规模数据)

如果数据已为Numpy数组格式,利用矢量化操作可大幅提升处理效率:

import numpy as np

# 假设value_list是形状为(N,3)的Numpy数组
arr = np.array(value_list)
i_arr, j_arr, val_arr = arr[:,0], arr[:,1], arr[:,2]

# 将(i,j)转换为唯一整数键,便于排序分组
keys = i_arr * n + j_arr
# 按键排序
sorted_indices = np.argsort(keys)
sorted_keys = keys[sorted_indices]
sorted_vals = val_arr[sorted_indices]

# 定位分组边界并拆分数据
split_points = np.where(sorted_keys[1:] != sorted_keys[:-1])[0] + 1
groups = np.array_split(sorted_vals, split_points)

# 转回嵌套列表(可选操作)
sorted_list = [[[] for _ in range(n)] for _ in range(m)]
current_idx = 0
for i in range(m):
    for j in range(n):
        key = i * n + j
        mask = sorted_keys[current_idx:] == key
        if np.any(mask):
            length = mask.argmin() if not mask.all() else len(mask)
            sorted_list[i][j] = groups[current_idx:current_idx+length]
            current_idx += length

该方法通过Numpy的矢量化运算规避Python循环,处理百万级以上数据时优势显著。

3. 并行化分组方案

分组操作本身无状态(每个元素的分组逻辑独立),可将数据拆分后并行处理,再合并结果:

from collections import defaultdict
from multiprocessing import Pool

def process_chunk(chunk):
    chunk_grouped = defaultdict(list)
    for i, j, val in chunk:
        chunk_grouped[(i,j)].append(val)
    return chunk_grouped

# 拆分数据为多个子块,chunk_size可根据CPU核心数调整
chunk_size = len(value_list) // 4
chunks = [value_list[k:k+chunk_size] for k in range(0, len(value_list), chunk_size)]

# 多进程并行处理
with Pool() as pool:
    results = pool.map(process_chunk, chunks)

# 合并各进程的分组结果
final_grouped = defaultdict(list)
for res in results:
    for key, vals in res.items():
        final_grouped[key].extend(vals)

这种方式绕过Python的GIL限制,在CPU密集型分组场景下能显著提速,且各进程处理独立子块,无共享资源竞争问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:17:22