信息区(Tensor)和存储区(Storage)。信息区主要保存着tensor的形状(size)、步长(stride)、数据类型(type)等信息,而真正的数据则保存成连续数组,存储在存储区。

  

Python内存共享结构体 pytorch共享内存_内存地址

“存储区”,注意:id(tensor)与id(tensor.storage)不同,id(tensor)是整个tensor所占的内存地址(包括信息区和存储区),而 id(tensor.storage)只是该tensor存储区的内存地址,也就是说某几个tensor的存储区的内存地址可以相同(即他们共享数据)。

1,切片操作:
  索引出来的结果与原数据共享内存(存储区内存地址相同,总内存地址不同)。
[In]:   x=torch.zeros(2,2)  # x: [ [ 0,0]
                  [0,0] ]
      y=x[0,:]
      y+=1
      print(y)
      print(x)
      print(id(y)==id(x))
      print(id(y.storage)==id(x.storage))
  [Out]:
      y:[[1,1]]
      x:[[1,1]
       [0,0]]
      False
      True
  
  2, view方法:
  view可以用来改变tensor的形状,返回新的tensor。
  返回的tensor与原数据共享data,即存储区内存地址相同,总内存地址不同
  [In]    x=torch.zeros(2,2)  # x: [ [ 0,0]
 
                 [0,0] ]
        y=x.view(4,1)    
     y+=1
     print(y)
     print(x)
     print(id(y)==id(x))
     print(id(y.storage)==id(x.storage))
  [Out] y: [[1][1][1][1]]
     x: [[1, 1]
       [1,1]]
     False
     True
  
  3 detach,data方法:
  与tensor全切片时相同。
 
  4 numpy,from_numpy方法
  该方法将tensor与numpy相互转换,这两个函数所产生的tensor与numpy的数组共享内存(即存储区内存相同)。