PERF: Using Numpy C-API for left-join calls
- [ ] closes #xxxx
- [ ] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

---

#### Benchmarks:

This is the setup:

```python
import pandas as pd

df1 = pd.DataFrame(
    {
        "Customer_id": pd.Series([1, 2, 3, 4, 5, 6]),
        "Product": pd.Series(
            ["Oven", "Oven", "Oven", "Television", "Television", "Television"]
        ),
    }
)

df2 = pd.DataFrame(
    {
        "Customer_id": pd.Series([2, 4, 6]),
        "State": pd.Series(["California", "California", "Texas"]),
    }
)
```

And the ```%timeit```:

```python
pd.merge(df1, df2, on="Customer_id", how="left")   
```

---

```
In [4]: %timeit pd.merge(df1, df2, on="Customer_id", how="left")
1.54 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) # Master
1.46 ms ± 21.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) # PR

In [5]: %timeit pd.merge(df1, df2, on="Customer_id", how="left")
1.47 ms ± 790 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each) # Master
1.45 ms ± 2.59 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) # PR

In [6]: %timeit pd.merge(df1, df2, on="Customer_id", how="left")
1.47 ms ± 1.99 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) # Master
1.48 ms ± 65 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) # PR
```
Since the results were so small I ran the same test several times: