If you are doing a pairwise move of 8000 rows, then this will be slow, because each move will cause the proxy model to update itself as you have seen.

It seems to me that instead of doing it pairwise, you might simply modify your model "behind the curtain" all at once, and use the QAbstractItemModel::beginResetModel() / QAbstractItemModel::endResetModel() notifications instead. The proxy will do the same work of recreating the mappings, but will do it only once.