PyTorch中Tensor的cos等方法是执行deep_copy还是clone?
PyTorch中Tensor的cos方法实现逻辑解析
核心结论:cos方法既不是深拷贝也不触发Python层面的拷贝机制
PyTorch的Tensor运算方法(包括cos)完全在C++/CUDA底层实现,和Python的__copy__、__deepcopy__机制无关,不会触发这两个方法的调用。
为什么自定义Tensor子类调用cos后仍为子类类型?
PyTorch的Tensor子类继承体系通过元类与内部类型包装逻辑自动保留子类类型:
- 当调用
sub.cos()时,底层C++完成运算后,会通过torch::autograd::as_view等内部逻辑,将新生成的Tensor数据直接包装为你的TensorSub子类实例,而非先创建原生Tensor再做类型拷贝。 - 这个过程依赖PyTorch的
__torch_function__协议或元类的__call__方法实现类型继承,不需要调用Python层面的拷贝方法。
关于Tensor运算的"拷贝"本质
PyTorch中cos()这类运算生成新Tensor的过程,不属于常规意义的"拷贝":
- 运算会直接分配新内存、计算并写入结果数据,新Tensor与原Tensor无存储共享,是运算生成独立新实例的过程。
- 即使是
clone()方法,也是在C++层面完成内存复制,同样不会触发Python的__copy__或__deepcopy__。
验证子类实例生成逻辑
如果想确认子类的构造过程,可以重载子类的__new__或__init__方法添加打印:
import torch class TensorSub(torch.Tensor): def __new__(cls, *args, **kwargs): print("TensorSub __new__ 被调用") return super().__new__(cls, *args, **kwargs) sub = TensorSub([1.0, 2.0]) sub2 = sub.cos() # 此处会打印"TensorSub __new__ 被调用"
运行后能看到子类构造方法被触发,这就是PyTorch将运算结果包装回子类的直接证据。
内容的提问来源于stack exchange,提问作者P. Quinton
相关产品推荐
相关产品推荐

