> Why are you doing this simplification, especially when the result you obtain may not be valid, e.g. (x**2)**y is not always x**(2*y) but that is what the logic of what you added will do.

Ok.  Why: our definition of O(f(x)) symbol explicitly stated that phase of f(x) is irrelevant.  That's why we can combine some power exponents (only "on top" of the expression tree for f(x)), e.g. x**p * (-x)**q -> x**(p+q) for *real* p, q.

> Match is also pretty slow.

IMHO, code with match() is more clear.  But if you disagree, I'll write this part.

Unfortunately, it seems I can't apply some assumptions for Wild.  This doesn't work:
```
q = Wild("q", real=True, exclude=[x])
              ^^^^^^^^^
```

> Could you get something like (-2*x**z)**y?

No, this shouldn't be the case.  Positive constants already eliminated at this stage (see expand() at bottom of the '__new__' method).  So, this works too:
```
In [3]: O((-2*x**3)**(S(5)/2))
Out[3]: 
 ⎛ 15/2⎞
O⎝x    ⎠
```