在Pytorch 1.0.0中,我发现一个tensor变量占用的内存非常小,我想知道它是如何存储这么多数据的,下面是代码。
tensor
a = np.random.randn(1, 1, 128, 256) b = torch.tensor(a, device=torch.device('cpu')) a_size = sys.getsizeof(a) b_size = sys.getsizeof(b)
是262288。是72。
kninwzqo1#
答案分为两部分:从sys.getsizeof的文档来看,首先所有内置对象都将返回正确的结果,但这不一定适用于第三方扩展,因为它是特定于实现的。所以对于Tensor__sizeof__可能是未定义的,或者定义的与你期望的不同--这个函数不是你可以依赖的。只计算直接归因于对象的内存消耗,而不计算它所引用的对象的内存消耗。这意味着,如果torch.Tensor对象只包含对实际内存的引用,那么sys.getsizeof中就不会显示这个值。
sys.getsizeof
__sizeof__
torch.Tensor
import torch, sys b = torch.randn(1, 1, 128, 256, dtype=torch.float64) sys.getsizeof(b) >> 72 sys.getsizeof(b.storage()) >> 262208
注意:我将dtype显式设置为float64,因为这是numpy中的默认值dtype,而torch默认使用float32。
dtype
float64
numpy
torch
float32
1条答案
按热度按时间kninwzqo1#
答案分为两部分:从
sys.getsizeof
的文档来看,首先所有内置对象都将返回正确的结果,但这不一定适用于第三方扩展,因为它是特定于实现的。
所以对于Tensor
__sizeof__
可能是未定义的,或者定义的与你期望的不同--这个函数不是你可以依赖的。只计算直接归因于对象的内存消耗,而不计算它所引用的对象的内存消耗。
这意味着,如果
torch.Tensor
对象只包含对实际内存的引用,那么sys.getsizeof
中就不会显示这个值。注意:我将
dtype
显式设置为float64
,因为这是numpy
中的默认值dtype
,而torch
默认使用float32
。