Hello everyone,
I am wondering what is the most efficient way to perform multiplication of tensors contained in a sublist within two lists.
Let us say that I have a list A containing sublists a1,...ak containing tensors of different sizes within each list, e.g. a1 = [a11, a12, a13, a14] where
a11.size() == torch.Size([128, 274])
a12.size() == torch.Size([1, 128])
a13.size() == torch.Size([256, 128])
a14.size() == torch.Size([1, 256])

but note that each list within A contains tensors that have the same sizes as those in a1.
Now consider a quite similar list, B = [b1,..., bn], where each sublist bi contains the same number of tensors as those in the sublist of A. Moreover, the inner tensors have the same shapes as those in each sublist aj.
I am looking to “multiply” each sublist in A with each sublist in B such that I get a list C which contains k lists, each containing the matrix multplication of the sublists aj with each sublist in B. Formally,
C = [ [a1 * b1, a1 * b2, ..., a1 * bn], [a2 * b1, a2 * b2, ..., a2 * bn], ..., ]

where  a1 * b1 denotes [a11 * b11, a12 * b12, a13 * b13, a14 * b14].
However, I cannot perform a multiplication between list of tensors efficiently, for instance trying a1 * b1 outputs the following error
TypeError: can't multiply sequence by non-int of type 'list'

Thus my guess is that the format in which I am storing my tensors is probably not optimal.
Is the best way to perform such computation the following
c =  [ [torch.mul(aik, bjk)) for aik, bjk in zip(ai, bj)] for ai, bj in zip(A, B)]

or is there a more efficient way to do so ? (e.g. storing tensors in other than a list).