PERF: StringArray construction
Currently, when constructing through `Series(data, dtype="string")`, pandas first converts to strings/NA, then does a check that all scalars are actually strings or NA. The check is not needed in cases where we explicitly already have converted.

Performance example:

```python
>>> x = np.array([str(u) for u in range(1_000_000)], dtype=object)
>>> %timeit pd.Series(x, dtype="string")
357 ms ± 40.2 ms per loop  # v1.1.0
148 ms ± 713 µs per loop  # after #35519
26.3 ms ± 291 µs per loop  # after #36304
12.6 ms ± 115 µs per loop  # this PR
```

xref #35519, #36304 & #36317.
rebase/lint checks I'd prefer not to have a public argument that allows people to create an invalid object.

> The check is not needed in cases where we explicitly already have converted.

Can you say a bit more / give an example where we're doing the conversion / validation twice? Keep in mind that even if we know that we have all strings, we want to normalize all the NA values to `pd.NA`. > Can you say a bit more / give an example where we're doing the conversion / validation twice? 

`_from_sequence` converts the input to an object array of all strings (or nans), and then `__init__` validates that the input are all strings (which we know is the case, as `_from_sequence` already ensured the conversion) Right, Thanks.

Thoughts on refactoring `_from_sequence` to use `object.__new__(StringArray)` and then manually initializing by setting `_ndarray` and `_dtype` (and skipping the conversion / checks we don't need?) My preference would be to keep this out of the public API given the relative immaturity of StringArray. I'll look into this tonight or tomorrow. I’ve made a new version. thanks @topper-123 