docs: def combine_faster(files: List[str], output_file: str, file_attrs: Dict[str, str] = None, selections: List[np.ndarray] = None, key: str = None, skip_attrs: List[str] = None) -> None:
  	"""
  	Combine loom files and save as a new loom file
  
  	Args:
  		files (list of str):    the list of input files (full paths)
  		output_file (str):      full path of the output loom file
  		file_attrs (dict):      file attributes (title, description, url, etc.)
  		selections:				list of indicator arrays (one per file; or None to include all cells for the file) determining which columns to include from each file, or None to include all cells from all files
  		key:					row attribute to use as key for ordering the rows, or None to skip ordering
  		skip_attrs:				list of column attributes that should not be included in the output
  
  	Returns:
  		Nothing, but creates a new loom file combining the input files.
  
  		Note that the loom files must have exactly the same
  		number of rows, in exactly the same order, and must have exactly the same column attributes.
  		Values in layers missing from one or more files will be replaced by zeros
  
  		.. warning::
  			The files will be combined without changing
  			the ordering of rows or columns. Row attributes will be taken from the first file.
  			Hence, if rows are not in the same order in all files, the result may be meaningless.
  	
  	Remarks:
  		This version assumes that the individual files will fit in memory. If you run out of memory, try the standard combine() method.
  	"""
  	if file_attrs is None:
  		file_attrs = {}
  
  	if len(files) == 0:
  		raise ValueError("The input file list was empty")
  
  	if selections is None:
  		selections = [None for _ in files]  # None means take all cells from the file
  
  	n_cells = 0
  	n_genes = 0
  	for f, s in zip(files, selections):
  		with loompy.connect(f, "r") as ds:
  			if n_genes == 0:
  				n_genes = ds.shape[0]
  			elif n_genes != ds.shape[0]:
  				raise ValueError(f"All files must have exactly the same number of rows, but {f} had {ds.shape[0]} rows while previous files had {n_genes}")
  			if s is None:
  				n_cells += ds.shape[1]
  			else:
  				n_cells += s.sum()
  
  	col_attrs: Dict[str, np.ndarray] = {}
  	ix = 0
  	with loompy.new(output_file, file_attrs=file_attrs) as dsout:
  		for f, s in zip(files, selections):
  			with loompy.connect(f, "r") as ds:
  				if key is not None:
  					ordering = np.argsort(ds.ra[key])
  				dsout.shape = (ds.shape[0], n_cells)  # Not really necessary to set this for each file, but no harm either; needed in order to make sure the first layer added will be the right shape
  				n_selected = s.sum()
  				for layer in ds.layers.keys():
  					# Create the layer if it doesn't exist
  					if layer not in dsout.layers:
  						dsout[layer] = ds[layer].dtype.name
  					# Make sure the dtype didn't change between files
  					if dsout.layers[layer].dtype != ds[layer].dtype:
  						raise ValueError(f"Each layer must be same datatype in all files, but {layer} of type {ds[layer].dtype} in {f} differs from previous files where it was {dsout[layer].dtype}")
  
  					if key is None:
  						dsout[layer][:, ix: ix + n_selected] = ds[layer][:, :][:, s]
  					else:
  						dsout[layer][:, ix: ix + n_selected] = ds[layer][:, :][:, s][ordering, :]
  				for attr, vals in ds.ca.items():
  					if attr in skip_attrs:
  						continue
  					if attr in col_attrs:
  						if col_attrs[attr].dtype != vals.dtype:
  							raise ValueError(f"Each column attribute must be same datatype in all files, but {attr} is {vals.dtype} in {f} but was {col_attrs[attr].dtype} in previous files")
  					else:
  						shape = list(vals.shape)
  						shape[0] = n_cells
  						col_attrs[attr] = np.zeros(shape, dtype=vals.dtype)
  					col_attrs[attr][ix: ix + n_selected] = vals[s]
  				for attr, vals in ds.ra.items():
  					if attr not in dsout.ra:
  						if key is None:
  							dsout.ra[attr] = vals
  						else:
  							dsout.ra[attr] = vals[ordering]
  			ix = ix + n_selected
  		for attr, vals in col_attrs.items():
  			dsout.ca[attr] = vals