First, a baseline on my system:
an = np.linspace(1, 5, 5, dtype=np.float32)
%timeit 2*an  # 1.27 µs ± 14.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

a = torch.linspace(1, 5, 5)
%timeit 2*a  # 9.25 µs ± 49.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Maybe the problem is that broadcasting is slow in pytorch. If I do instead:
b = torch.ones_like(a) * 2
%timeit b*a  # 3.74 µs ± 147 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

But then if I do:
bn = np.ones_like(an) * 2
%timeit bn*an  # 609 ns ± 5.38 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

So… numpy benefits from getting rid of broadcasting too. I’m not sure what to conclude here.