qutip 5.X can support many format for Qobj whereas v4 support only sparse arrays. It's not always great at using the right format.
What happen in your case is that it uses a Dense matrix for the Liouvillian where your matrix is quite sparse.
Unless expressly told, `Qobj.expm` will return a dense matrix. v4 will round off the small off-diagonal values automatically.
To get a sparse matrix, you can use (1j*y).expm(dtype="CSR") or (1j*y).expm().to("CSR").
To control the cutoff you can use tidyup: (1j*y).expm().to("CSR").tidyup(atol=1-e8), otherwise the cut off comes from floating point precision.
Another issue that v5 is bad with is creating operators from kets.
basis(3, 0) will use a Dense representation per default and this will spread to the whole Liouvillian.
Every Qobj creating function should have a dtype parameter to tell it the type you want:
e = tensor(basis(Natomic, 0, dtype="csr"), qeye(Nmotion))
r = tensor(basis(Natomic, 1, dtype="csr"), qeye(Nmotion))
g = tensor(basis(Natomic, 2, dtype="csr"), qeye(Nmotion))
In you case, you can convert everything once at the end:
H = H.to("CSR").tidyup(atol)
To get timings that are within 10% of v4's.
Hope this helps