NumPy中的empty函数是什么?它与zeros函数有何区别?
NumPy 中
empty与zeros的具体差异 首先先澄清常见认知偏差:
你听到的“
empty会返回内存中原有存储值构成的数组”是绝大多数运行场景下的实际表现,但这并不是NumPy对empty函数的强制行为约定,只是它的实现逻辑带来的附带结果,不能当成可依赖的固定特性。
两者的核心差异可以归为三类:
- 初始化逻辑完全不同
- 调用
zeros创建数组时,NumPy在向系统申请到对应大小的内存块之后,会逐字节把内存位全部设置为对应数据类型的0值:数值类型是0,布尔类型是False,字符串类型是空值,返回的数组所有元素值都是确定、可预期的。 - 调用
empty创建数组时,NumPy只做内存申请的动作,完全跳过所有初始化写入步骤,不会对拿到的内存块做任何修改。你看到的所谓“内存原有值”,就是这块内存之前被其他程序使用、释放后残留的比特数据,NumPy既不清理也不校验这些值是什么;在极少数特殊的内存分配策略下,empty甚至可能返回全0的数组,只是这种情况概率极低,不能作为使用依据。
- 调用
- 性能差距明显
zeros的运行耗时和数组大小正相关:因为要给整块内存写0值,数组越大,写入耗时越长。empty不需要做任何内存写入操作,不管申请多大尺寸的数组,耗时都只有内存分配的固定极小开销,是NumPy所有数组构造方法里速度最快的。
- 使用风险和适用场景不同
zeros没有值不确定的风险,直接用就可以,适合所有需要初始值为0的计算场景。empty只有在你创建数组之后,马上会给所有元素逐一赋值覆盖的场景下才适合用,绝对不能直接读取empty生成的数组元素参与计算——残留值完全不可控,会直接导致计算结果出错。
可以用小段代码直观验证差异:
import numpy as np # zeros输出永远是固定全0 print(np.zeros((2, 2), dtype=int)) # 输出固定: # [[0 0] # [0 0]] # empty输出无固定值,每次运行结果都可能变化 print(np.empty((2, 2), dtype=int)) # 某次运行的输出示例(你跑的时候大概率得到完全不同的值): # [[4607182418800017408 4607182418800017408] # [4607182418800017408 4607182418800017408]]
内容的提问来源于stack exchange,提问作者Harsh Thakkar
相关产品推荐
相关产品推荐

