wouldn't it make sense to have it loop over np.sqrt(self._sizes)? I know that isn't what the code did originally, but I wonder if this would be a small improvement due to the inherent overhead of numpy scalar operations?