code: def time_me(func=None, n_loops=10):
      """Decorator returning average runtime in seconds over n_loops
  
      Args:
          func (function): invoked with given args / kwargs
          n_loops (int): number of times to invoke function for timing
  
      Returns: tuple of (time in seconds, inner quartile range, function return value).
      """
      if func is None:
          return functools.partial(time_me, n_loops=n_loops)
  
      @functools.wraps(func)
      def timing_wrapper(*args, **kwargs):
          return_val = func(*args, **kwargs)
          times = []
          for _ in range(n_loops):
              start = timeit.default_timer()
              func(*args, **kwargs)
              times.append(timeit.default_timer() - start)
          mid_runtime = np.quantile(times, 0.5)
          q1_runtime = np.quantile(times, 0.25)
          q3_runtime = np.quantile(times, 0.75)
          runtime = Runtime(mid_runtime, q1_runtime, q3_runtime)
          return runtime, return_val
  
      return timing_wrapper
  
imports: import argparse
  import functools
  import os
  import timeit
  from collections import namedtuple
  import crypten
  import crypten.communicator
  import numpy
  import pandas
  import torch
  from examples import multiprocess_launcher
label_desc: Use image node_id 1 for calling a global function with example usage: time_me(func, n_loops) and returns: timing_wrapper, functools, runtime,  return_val