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

Julia与Python生成3D数组唯一值索引字典的性能差异问询

问题分析与优化方案

你的这种性能差距不完全是Julia和Python的原生性能差异,而是当前Python实现存在两个致命的性能瓶颈,把差距放大了:

核心瓶颈点

  • 字符串转换的巨大开销:Python中虽然不能直接用可变数组当字典键,但你选择转成str(val)的方式成本极高——600万次3D数组转字符串,每次都要遍历数组元素、拼接字符,哈希计算也远慢于Julia中直接用可哈希类型(比如不可变数组、元组)当键的操作。
  • 低效的列表更新:用extend([index])每次都要创建一个单元素临时列表,再执行扩展操作,这比直接append(index)多了不必要的对象创建和内存操作,累积下来开销惊人。

优化后的Python实现

针对上述问题,调整代码如下:

def unique_ids(row_list):
    d = {}
    for index, val in enumerate(row_list):
        # 将3D元素转为元组作为键(兼容numpy数组或普通列表)
        key = tuple(val.flatten()) if hasattr(val, 'flatten') else tuple(val)
        if key in d:
            d[key].append(index)
        else:
            d[key] = [index]
    return list(d.values())

更高效的向量化实现(基于numpy)

如果你的3D元素是numpy数组,用向量化方法能进一步提升性能:

import numpy as np

def unique_ids_numpy(arr):
    # 假设输入是形状为(6000000, 3)的numpy数组
    unique_vals, inverse_indices = np.unique(arr, axis=0, return_inverse=True)
    # 按逆索引分组获取原索引
    return [np.where(inverse_indices == idx)[0].tolist() for idx in range(len(unique_vals))]

总结

原生Julia在类型稳定的循环场景下确实有性能优势,但你的初始Python代码因不合理的转换和操作,导致性能被严重拖累。优化后的Python版本性能会大幅提升,虽然可能仍略逊于Julia,但绝不会慢到无法统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:50:42