code: def print_per_function_stats(self):
      cpu_funcs = []
      n_gpu_func_calls = 0
      n_cpu_func_calls = 0
      total_gpu_time = 0
      total_cpu_time = 0
  
      table = Table()
      for col in (
          "Function",
          "GPU ncalls",
          "GPU cumtime",
          "GPU percall",
          "CPU ncalls",
          "CPU cumtime",
          "CPU percall",
      ):
          table.add_column(col)
  
      for func_name, func_data in self.per_function_stats.items():
          gpu_times = func_data["gpu"]
          cpu_times = func_data["cpu"]
          table.add_row(
              func_name,
              f"{len(gpu_times)}",
              f"{sum(gpu_times):.3f}",
              f"{sum(gpu_times) / max(len(gpu_times), 1):.3f}",
              f"{len(cpu_times)}",
              f"{sum(cpu_times):.3f}",
              f"{sum(cpu_times) / max(len(cpu_times), 1):.3f}",
          )
          total_gpu_time += sum(gpu_times)
          total_cpu_time += sum(cpu_times)
          n_gpu_func_calls += len(gpu_times)
          n_cpu_func_calls += len(cpu_times)
  
          if cpu_times and func_name not in cpu_funcs:
              cpu_funcs.append(func_name)
  
      time_elapsed = self.end_time - self.start_time
      table.title = f"""\n\
          Total time elapsed: {time_elapsed:.3f} seconds
          {n_gpu_func_calls} GPU function calls in {total_gpu_time:.3f} seconds
          {n_cpu_func_calls} CPU function calls in {total_cpu_time:.3f} seconds
  
          Stats
          """
      console = Console()
      console.print(table)
  
      if cpu_funcs:
          call_to_action = (
              "To request GPU support for any of these functions, "
              "please file a Github issue here: "
              "[link=https://github.com/rapidsai/cudf/issues/new?assignees"
              "=&labels=%3F+-+Needs+Triage%2C+feature+request&projects="
              "&template=pandas_function_request.md&title=%5BFEA%5D]"
              "https://github.com/rapidsai/cudf/issues/new/choose"
              "[/link]."
          )
          console.print(
              _cpu_issue_text.format(
                  cpu_functions_used=format_cpu_functions_used(
                      cpu_funcs
                  )
              )
          )
          console.print(call_to_action)
  
imports: import inspect
  import operator
  import pickle
  import sys
  import time
  from collections import defaultdict
  from typing import Union
  from rich.console import Console
  from rich.syntax import Syntax
  from rich.table import Table
  from .fast_slow_proxy import _FinalProxy, _FunctionProxy, _IntermediateProxy, _MethodProxy
label_desc: Use image node_id 9 for calling the Profiler obj's underlying member method code with example usage: obj.print_per_function_stats() without return types