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

Numba非Python模式下嵌套列表排序函数的替代实现需求

Numba非Python模式下嵌套列表排序的替代方案

原代码中使用sorted配合lambda键函数的方式在Numba njit模式下不被支持,因为Numba对高阶函数和匿名函数的支持有限。以下是两种可行的替代实现:

方法一:基于Numpy数组的排序(推荐)

利用Numba支持的np.lexsort实现多列排序,效率更高,适合大数据量场景:

import numba
import numpy as np

@numba.njit
def nested_sort_np(arr):
    # lexsort参数顺序:次排序键在前,主排序键在后
    # 此处实现先按第1列索引1升序,再按第2列索引2升序
    sort_indices = np.lexsort((arr[:, 2], arr[:, 1]))
    return arr[sort_indices]

# 测试示例
s = [[1, 3, 11], [2, 3, 19], [3, 2, 18], [4, 2, 9]]
# 将列表转换为numpy数组
input_arr = np.array(s)
# 调用排序函数并转回列表格式
sorted_result = nested_sort_np(input_arr).tolist()
print(sorted_result)
# 输出:[[4, 2, 9], [3, 2, 18], [1, 3, 11], [2, 3, 19]]

方法二:纯列表手动实现排序算法

如果不想依赖Numpy,可以手动实现排序逻辑(以冒泡排序为例),直接在循环中比较排序键:

import numba

@numba.njit
def nested_sort_list(s):
    # 复制输入列表避免修改原数据
    lst = [row.copy() for row in s]
    n = len(lst)
    for i in range(n):
        swapped = False
        for j in range(0, n - i - 1):
            # 先比较第1列,相等则比较第2列
            if lst[j][1] > lst[j+1][1] or (lst[j][1] == lst[j+1][1] and lst[j][2] > lst[j+1][2]):
                lst[j], lst[j+1] = lst[j+1], lst[j]
                swapped = True
        # 若某轮无交换,说明已排序完成,提前退出
        if not swapped:
            break
    return lst

# 测试示例
s = [[1, 3, 11], [2, 3, 19], [3, 2, 18], [4, 2, 9]]
print(nested_sort_list(s))
# 输出:[[4, 2, 9], [3, 2, 18], [1, 3, 11], [2, 3, 19]]

两种方案对比

  • Numpy方案:运行效率高,Numba对Numpy操作的优化更充分,适合处理大规模数据。
  • 纯列表方案:无需依赖Numpy,代码逻辑更贴近原生列表操作,适合小规模数据场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:00:13