In fact there is a good way to make proposed cse to better match current cse output:
doing
`new_expr = type(expr)(*map(_recreate, expr.args))`
only `if map(_recreate, expr.args) != expr.args`.

Done and committed: https://github.com/cdsousa/sympy/commit/be292794c0efdcf138482d61f5d515797fabafea

So now, `cse(2*x + 2*y + 2*z)` returns `2*(x + y + z)` when the default `optimizations=[(factor_terms, None)]` is used.