使用pytorch/python,覆盖变量还是定义新变量更好?

使用pytorch/python,覆盖变量还是定义新变量更好?,python,pytorch,Python,Pytorch,假设我有一个使用pytorch在python中执行以下操作的算法。请忽略这些步骤是否有效。这只是一个愚蠢的玩具例子 def foo(input_list): # input_list is a list of N 2-D pytorch tensors of shape (h,w) tensor = torch.stack(input_list) # convert to tensor.shape(h,w,N) tensor1 = torch.transpo

假设我有一个使用pytorch在python中执行以下操作的算法。请忽略这些步骤是否有效。这只是一个愚蠢的玩具例子

 def foo(input_list):
      # input_list is a list of N 2-D pytorch tensors of shape (h,w)
      tensor = torch.stack(input_list) # convert to tensor.shape(h,w,N)
      tensor1 = torch.transpose(tensor,0,2).unsqueeze(1) # convert to tensor.shape(N,1,h,w)
      tensor2 = torch.interpolate(tensor1,size=(500,500) # upsample to new shape (N,1,500,500)

 def bar(input_list):
      tensor = torch.stack(input_list) # convert to tensor.shape(h,w,N)
      tensor = torch.transpose(tensor,0,2).unsqueeze(1) # convert to tensor.shape(N,1,h,w)
      tensor = torch.interpolate(tensor,size=(500,500) # upsample to new shape (N,1,500,500)

我的问题是,使用方法
foo()
bar()
是否更有意义,或者如果这不重要的话。我的想法是,我通过重写相同的变量名(
bar
)来节省内存,因为我永远不需要这些中间步骤。但是,如果CUDA接口为每个函数创建新的内存空间,那么我在这两种方法中使用的内存量是相同的

在您的示例中,tensor和tensor1只是内存中相同数据的不同视图,因此维护两个稍微不同的引用的内存差异应该可以忽略不计。相关部分只能是
tensor1
vs
tensor2

您可能希望看到类似的问题:

由于对实际分配新内存的tensor的重新分配也是
bar
中的最后一个调用,因此我怀疑在这个特定示例中,总内存不会受到影响(
tensor1
在函数返回后将不被引用)


对于较长的操作链,我认为不能保证在这些重新分配中调用GC,尽管它可能会给python带来更多的灵活性。我可能更喜欢
foo
中的样式,因为以后更容易更改链中的操作顺序。跟踪不同的名称会增加程序员的开销,而不仅仅是解释器。

使用哪个函数并不重要,因为在这两种情况下都会创建新的变量。如果您不想创建新变量,请查看诸如transpose_之类的内置函数如果您确实遇到内存问题,可以使用torch.cuda.empty_cache()释放未使用的GPU内存。如果在函数末尾调用此函数,应该会有一些不同,因为对该内存的引用会阻止它被清除。(我假设你没有跟踪梯度,因为这会产生引用,即使中间张量没有用变量显式引用)。