class_docstr: manages a local index, that does the coarse quantization and a set
  of sub_indexes. The sub_indexes search a subset of the inverted
  lists. The SplitPerListIndex merges results from the sub-indexes
class_docstr_tok: ["manages","a","local","index",",","that","does","the","coarse","quantization","and","a","set","of","sub_indexes",".","The","sub_indexes","search","a","subset","of","the","inverted","lists",".","The","SplitPerListIndex","merges","results","from","the","sub-indexes"]
code: def balance_lists(self, list_nos):
      big_il = self.index.big_il
      weights = np.array(
          [big_il.list_size(int(i)) for i in list_nos.ravel()]
      )
      bins, assign = distribute_weights(weights, self.ni)
      if self.verbose:
          print(
              "bins weight range %d:%d total %d (%.2f MiB)"
              % (
                  bins.min(),
                  bins.max(),
                  bins.sum(),
                  bins.sum() * (self.code_size + 8) / 2**20,
              )
          )
      self.nscan = bins.sum()
      return assign.reshape(list_nos.shape)
  
imports: import time
  from faiss.contrib import rpc
  import combined_index
  import argparse
  from multiprocessing.pool import ThreadPool
  import faiss
  import numpy
label_desc: Use image node_id 6 for calling the SplitPerListIndex obj's underlying member method code with example usage: obj.balance_lists(list_nos) and returns: assign