CLN: small ops optimizations
@jorisvandenbossche you've mentioned some ops optimizations; any suggestions for things to add here?
Do you have an idea how much those changes matter? 

(anyway, even if it is almost negligible, I think eg checking the actual dtype with the `is_..._dtype` functions is better (more explicit) than passing the "container that has a dtype" so an improvement anyway)

> you've mentioned some ops optimizations; any suggestions for things to add here?

Not directly related to the ones you are doing here. I need to look it up again (I described it in the issue about the slowdown), but it was mainly about the way we iterate through the columns and how to reconstruct the DataFrame/Series back in the end, not so much the ops itself. > Do you have an idea how much those changes matter?

Haven't measured these specifically, but I know the is_foo_dtype checks get about a 2x speedup from passing dtype #27224 reverted sparse changes, except for one cosmetic thing that annoyed me updated to change `if is_extension_array_dtype(right) and not is_scalar(right)` to reverse the order of the two checks.  if we happen to have a str, the `is_extension_array_dtype(right)` can be fairly expensive Thanks @jbrockmendel 