float16 inconsistenly slow assignment
I know float16 is not very supported a lot, but wanted to mention this at least for a reference if no one can help.


#### Code Sample, a copy-pastable example if possible
Every second assignment to a particular column is slow by several orders of magnitude on float16. Bear with me with the example - it's in ipython and I am using `%time` instead of timeit because the latter doesn't work in this case (it's "cached").

```
In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: df = pd.DataFrame(pd.np.random.randint(0, 100, (90000, 9000)), dtype='float16')

In [4]: %time df.loc[:, 'cc'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 2.1 ms, sys: 3.77 ms, total: 5.87 ms
Wall time: 5.25 ms

In [5]: %time df.loc[:, 'cc'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 22.2 s, sys: 2.58 s, total: 24.8 s
Wall time: 24.9 s

In [6]: %time df.loc[:, 'cc'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 0 ns, sys: 2.39 ms, total: 2.39 ms
Wall time: 1.9 ms

In [7]: %time df.loc[:, 'cc'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 2.21 ms, sys: 327 µs, total: 2.54 ms
Wall time: 1.85 ms

In [8]: %time df.loc[:, 'dd'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 12.8 ms, sys: 0 ns, total: 12.8 ms
Wall time: 11.1 ms

In [9]: %time df.loc[:, 'dd'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 465 ms, sys: 1.2 s, total: 1.67 s
Wall time: 1.68 s

In [10]: %time df.loc[:, 'dd'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 556 µs, sys: 101 µs, total: 657 µs
Wall time: 615 µs

In [11]: %time df.loc[:, 'qq'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 5.02 ms, sys: 0 ns, total: 5.02 ms
Wall time: 4.71 ms

In [12]: %time df.loc[:, 'qq'] = np.full(df.shape[0], pd.np.nan, dtype='float16')
CPU times: user 480 ms, sys: 1.18 s, total: 1.66 s
Wall time: 1.67 s

# float64 does not exhibit this
In [13]: %time df.loc[:, 'zz'] = np.full(df.shape[0], pd.np.nan, dtype='float64')
CPU times: user 4.74 ms, sys: 2.9 ms, total: 7.63 ms
Wall time: 6.47 ms

In [14]: %time df.loc[:, 'zz'] = np.full(df.shape[0], pd.np.nan, dtype='float64')
CPU times: user 5.06 ms, sys: 0 ns, total: 5.06 ms
Wall time: 3.77 ms

In [15]: %time df.loc[:, 'zz'] = np.full(df.shape[0], pd.np.nan, dtype='float64')
CPU times: user 4.47 ms, sys: 0 ns, total: 4.47 ms
Wall time: 3 ms

In [16]: %time df.loc[:, 'bb'] = np.full(df.shape[0], pd.np.nan, dtype='float64')
CPU times: user 7.52 ms, sys: 12.1 ms, total: 19.6 ms
Wall time: 16.9 ms

In [17]: %time df.loc[:, 'bb'] = np.full(df.shape[0], pd.np.nan, dtype='float64')
CPU times: user 5.12 ms, sys: 0 ns, total: 5.12 ms
Wall time: 3.74 ms
```
#### Problem description
Assignments with float16 are much slower on a *second assignment*. The above is consistently slow, especially on a big dataframe. I was able to reproduce this on several computers.

There are even weirder situations. Consider this [line](https://gist.github.com/hnykda/0099d0629f8ba45ace50c3e8896a2fb2#file-gistfile1-txt-L35), where it takes several orders of magnitude less than in other cases. 

#### Expected Output
It would be fast as the first assignment.

#### Output of ``pd.show_versions()``
```In [23]: pd.show_versions()

INSTALLED VERSIONS
------------------
commit: None
python: 3.6.2.final.0
python-bits: 64
OS: Linux
OS-release: 4.17.2-1-ARCH
machine: x86_64
processor: 
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

pandas: 0.22.0
pytest: 3.3.1
pip: 9.0.1
setuptools: 36.5.0.post20170921
Cython: None
numpy: 1.13.3
scipy: 1.0.0
pyarrow: 0.8.0
xarray: None
IPython: 6.2.1
sphinx: None
patsy: 0.4.1
dateutil: 2.6.1
pytz: 2017.2
blosc: None
bottleneck: None
tables: 3.4.2
numexpr: 2.6.4
feather: 0.4.0
matplotlib: 2.1.0
openpyxl: None
xlrd: None
xlwt: None
xlsxwriter: None
lxml: None
bs4: 4.6.0
html5lib: 0.999999999
sqlalchemy: None
pymysql: None
psycopg2: None
jinja2: 2.9.6
s3fs: 0.1.2
fastparquet: None
pandas_gbq: None
pandas_datareader: None
```