I'm doing a bit of profiling right now. I was hoping that adding the limit of `1` to `.replace` would only read the str until it replaces, and I think it might:

```
In [11]: s = 'abc' + 'S' + ('d' * 1000000)

In [12]: %timeit s.replace('S', 's')
10000 loops, best of 3: 145 µs per loop

In [13]: %timeit s.replace('S', 's', 1)
10000 loops, best of 3: 85.2 µs per loop
```

I'll have a bit more soon.