damccorm commented on code in PR #41271:
URL: https://github.com/apache/beam/pull/41271#discussion_r4560576457


##########
sdks/python/apache_beam/metrics/metricbase.py:
##########
@@ -82,9 +82,12 @@ def __init__(
     self.name = name
     self.urn = urn
     self.labels = labels if labels else {}
+    self._cached_fast_name: Optional[str] = None
+    self._cached_hash: Optional[int] = None
+    self._typed_metric_names: dict = {}

Review Comment:
   Fixed in 5cd4e050750: removed `self._typed_metric_names = {}` from 
`MetricName.__init__` and `__setstate__` (it is lazily initialized in #41275).



##########
sdks/python/apache_beam/metrics/metricbase.py:
##########
@@ -97,17 +100,33 @@ def __str__(self):
           self.namespace, self.name)
 
   def __hash__(self):
-    return hash((self.namespace, self.name, self.urn) +
-                tuple(self.labels.items()))
+    if self._cached_hash is None:
+      self._cached_hash = hash(
+          (self.namespace, self.name, self.urn) +
+          tuple(self.labels.items())) if self.labels else hash(
+              (self.namespace, self.name, self.urn))
+    return self._cached_hash
 
   def fast_name(self):
-    name = self.name or ''
-    namespace = self.namespace or ''
-    urn = self.urn or ''
-    labels = ''
-    if self.labels:
-      labels = '_'.join(['%s=%s' % (k, v) for (k, v) in self.labels.items()])
-    return '%d_%s%s%s%s' % (len(name), name, namespace, urn, labels)
+    if self._cached_fast_name is None:
+      name = self.name or ''
+      namespace = self.namespace or ''
+      urn = self.urn or ''
+      labels = ''
+      if self.labels:
+        labels = '_'.join(['%s=%s' % (k, v) for (k, v) in self.labels.items()])
+      self._cached_fast_name = '%d_%s%s%s%s' % (
+          len(name), name, namespace, urn, labels)
+    return self._cached_fast_name
+
+  def __getstate__(self):
+    return (self.namespace, self.name, self.urn, self.labels)
+
+  def __setstate__(self, state):
+    self.namespace, self.name, self.urn, self.labels = state

Review Comment:
   Fixed in 5cd4e050750: added `isinstance(state, dict)` handling in 
`MetricName.__setstate__` and added 
`NameTest.test_metric_name_pickle_and_legacy_dict_state`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to