`iloc` and `__getitem__` have dramatically different performance: ```python df.iloc[:, 0] df[df.columns[0]] ``` The first can be as much as 200x slower. We must handle slices better internally for performance.