code: def profile(fn=None, skip=0, filename=None, immediate=False, dirs=False,
              sort=None, entries=40,
              profiler=('cProfile', 'profile', 'hotshot')):
      if fn is None:
          def decorator(fn):
              return profile(fn, skip=skip, filename=filename,
                             immediate=immediate, dirs=dirs,
                             sort=sort, entries=entries,
                             profiler=profiler)
          return decorator
      if isinstance(profiler, str):
          profiler = [profiler]
      for p in profiler:
          if p in AVAILABLE_PROFILERS:
              profiler_class = AVAILABLE_PROFILERS[p]
              break
      else:
          raise ValueError('only these profilers are available: %s'
                               % ', '.join(AVAILABLE_PROFILERS))
      fp = profiler_class(fn, skip=skip, filename=filename,
                          immediate=immediate, dirs=dirs,
                          sort=sort, entries=entries)
      def new_fn(*args, **kw):
          return fp(*args, **kw)
      new_fn.__doc__ = fn.__doc__
      new_fn.__name__ = fn.__name__
      new_fn.__dict__ = fn.__dict__
      new_fn.__module__ = fn.__module__
      return new_fn