You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:25:36