class_docstr: Execution stats for this block.
  
  Attributes:
      wall_time_s: The wall-clock time it took to compute this block.
      cpu_time_s: The CPU time it took to compute this block.
      node_id: A unique id for the node that computed this block.
class_docstr_tok: ["Execution","stats","for","this","block",".","Attributes",":","wall_time_s",":","The","wall-clock","time","it","took","to","compute","this","block",".","cpu_time_s",":","The","CPU","time","it","took","to","compute","this","block",".","node_id",":","A","unique","id","for","the","node","that","computed","this","block","."]
code: def __init__(self):
      self.start_time_s: Optional[float] = None
      self.end_time_s: Optional[float] = None
      self.wall_time_s: Optional[float] = None
      self.cpu_time_s: Optional[float] = None
      self.node_id = (
          ray.runtime_context.get_runtime_context().get_node_id()
      )
      # Max memory usage. May be an overestimate since we do not
      # differentiate from previous tasks on the same worker.
      self.max_rss_bytes: int = 0
      self.task_idx: Optional[int] = None
  
imports: import collections
  import os
  import time
  from dataclasses import dataclass
  from typing import TYPE_CHECKING, Callable, Dict, Iterator, List, Literal, Optional, Protocol, Tuple, TypeVar, Union
  import numpy
  import ray
  from ray import DynamicObjectRefGenerator
  from ray.data._internal.util import _check_pyarrow_version, _truncated_repr
  from ray.types import ObjectRef
  from ray.util.annotations import DeveloperAPI
  import psutil
label_desc: Use image node_id 1 to create a new BlockExecStats object  with example: obj = BlockExecStats()