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

AI训练场景下:如何快速将元组的元组转为二维numpy.array?

优化元组的元组转numpy数组的性能方案

核心优化:直接用np.array()一次性转换

你当前的代码先循环将每行转成小型numpy数组再堆叠,这会产生大量冗余的内存分配和拷贝操作,是性能瓶颈的主要原因。直接用np.array()处理整个元组的元组是最优解——numpy原生支持将嵌套序列(如元组的元组)直接转换为二维数组,一步到位:

rows = cursor.fetchall()
features = np.array(rows, dtype=np.float32)

该方法的输出形状与原代码完全一致((128, 78)),但性能提升显著:它跳过了循环创建小数组的开销,直接在底层完成内存布局与类型转换,速度通常能比原方法快一个数量级以上。

性能对比验证

以下是两种方法的耗时测试(模拟128行78列的元组数据):

import numpy as np
import timeit

# 模拟psycopg2返回的元组的元组结构
rows = tuple(tuple(np.random.rand(78) for _ in range(128)))

# 原实现
def original_convert():
    features = [np.array(r, dtype=np.float32) for r in rows]
    return np.stack(features, axis=0)

# 优化实现
def optimized_convert():
    return np.array(rows, dtype=np.float32)

# 测试1000次转换的耗时
print("原方法耗时:", timeit.timeit(original_convert, number=1000))
print("优化方法耗时:", timeit.timeit(optimized_convert, number=1000))

测试结果通常会显示优化方法的耗时仅为原方法的1/10甚至更低。

超大数据集适配:分批加载转换

如果数据集大到fetchall()会占用过多内存,可改用cursor.fetchmany()分批加载,每批直接用np.array()转换后送入模型训练,既保持转换性能,又控制内存占用:

batch_size = 128
while True:
    rows = cursor.fetchmany(batch_size)
    if not rows:
        break
    features = np.array(rows, dtype=np.float32)
    # 执行模型训练逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:31:06