Considering only performance, the best choice is the masked version `self.components_`, because timeseries extraction uses masked data in the end (nisl/region.py:255). In the current state, components are un-masked in `MultiPCA.fit` (multi_pca.py:240), and masked again in transform, through the call to NiftiMapsMasker.transform (multi_pca.py:263). The present state works fine, but it will use too much time and memory for no good reason (`self.components_` and `self.components_img_` are the same -big- thing, and conversion between them is performed multiple times). 

However, in the present state, there is no way to pass masked data to NiftiMapsMasker, meaning that  `self.components_` will have to be unmasked at some point. Thus, it's `self.components_` that must be dropped, at least until some optimization is performed.

Another performance issue: it seems that `components_img_` is computed twice in some cases. `CanICA.fit` calls `MultiPCA.fit`, and both call `masker_.inverse_transform`. This precise problem can be solved by doing lazy evaluation.