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

为何np.pad在数组前向填充场景下比concatenate或赋值慢得多?

为什么np.pad在前置常量填充场景下远慢于自定义方法?

我需要将n个长度可变(均小于500)的整数数组转换为尺寸为(n, 500)的矩阵,长度不足500的数组需在前方填充指定常量。测试后发现专门用于填充的np.pad相比其他方法速度极慢,甚至比自定义赋值方法慢10倍。以下是基准测试代码及结果:

import random
import time

import numpy as np


def pad(arr):
    retval = np.empty((500,), dtype=np.int64)
    idx = 500 - len(arr)
    retval[:idx] = 100001  # pad value
    retval[idx:] = arr  # original array
    return retval


a = [np.random.randint(low=0, high=100000, size=(random.randint(5, 500),), dtype=np.int64) for _ in range(32)]

# approach 1: np.pad
t = time.time()
for _ in range(10000):
    b = np.array([np.pad(cur, pad_width=(500 - len(cur), 0), mode='constant', constant_values=100001) for cur in a])
print(time.time() - t)

# approach 2: np.concatenate
t = time.time()
for _ in range(10000):
    b = np.array([np.concatenate((np.full((500 - len(cur),), 100001), cur)) for cur in a])
print(time.time() - t)

# approach 3: assign to an empty array
t = time.time()
for _ in range(10000):
    b = np.array([pad(cur) for cur in a])
print(time.time() - t)

b1 = np.array([np.pad(cur, pad_width=(500 - len(cur), 0), mode='constant', constant_values=100001) for cur in a])
b2 = np.array([np.concatenate((np.full((500 - len(cur),), 100001), cur)) for cur in a])
b3 = np.array([pad(cur) for cur in a])
print(np.allclose(b1, b2))
print(np.allclose(b1, b3))
print(np.allclose(b2, b3))

测试输出:

5.376873016357422
1.297654151916504
0.5892848968505859
True
True
True

性能差异的核心原因

  • 通用性带来的冗余开销:np.pad是一个通用型填充函数,支持边缘复制、镜像、线性插值等十几种填充模式,还能处理多维数组的多维度差异化填充。为了适配这些复杂场景,它内部会执行大量参数校验、模式分支判断、维度映射逻辑——这些步骤在你的"前置常量填充"简单场景下完全是冗余的,直接拉高了单次调用的时间成本。

  • 内存操作效率差距:自定义pad函数直接创建目标尺寸的空数组,通过切片赋值一次性完成常量填充和原数组拷贝,内存操作紧凑且直接。而np.pad内部可能涉及多次临时数组创建、多步骤内存拷贝,或者为兼容通用场景设计的非最优内存操作路径,效率远低于直接切片赋值。

  • 单函数调用的额外损耗:即便都是逐行处理,np.pad的内部实现包含更多函数嵌套、边界检查逻辑,这些微小的损耗在十万次循环中被放大,最终形成数倍甚至十倍的性能差距。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:25:30