我有张量x和class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> permutations=new ArrayList();
backtrack(permutations,new ArrayList<Integer>(),nums);
return permutations;
}
private void backtrack(List<List<Integer>> permutations,List<Integer> tempList,int[] nums){
if(tempList.size()==nums.length){
permutations.add(new ArrayList<Integer>(tempList));
return;
}
for(int i=0;i<nums.length;i++){
if(tempList.contains(nums[i])){
continue;
}
tempList.add(nums[i]);
backtrack(permutations,tempList,nums);
tempList.remove(tempList.size()-1);
}
}
我想向所有元素添加一个,并执行两个不同的操作
x.shape=(batch_size,10)
x=x+1
这两个操作具有相同的张量,但是当我调用for i in range(0,batch_size):
x[i]=x[i]+1
时,(2)在反向传播中所花费的时间比(1)多得多。
它们之间有什么区别?
答案 0 :(得分:0)
这是预料之中的。首先,转发速度也要慢很多:在您的for
循环中,Python向PyTorch发送以下请求的batch_size
倍:
i
的第x
个元素i
的第x
个元素Python运行缓慢。在第二版中,Python向PyTorch分配了一条消息“到处添加1”。 PyTorch比Python快得多(更不用说它具备的GPU加速功能了)。这要归功于称为vectorization的技术,它不是特定于PyTorch的技术,而是基本上所有的Python(以及许多其他)数学软件包。
第二,对于您的后退,PyTorch需要跟踪x
发生的所有操作并通过它们进行反向传播。在第一种情况下,有batch_size
个,在第二种情况下,只有一个。再次,矢量化是胜利。