diff --git a/docs/release.rst b/docs/release.rst index 736838cdaf..346d673d68 100644 --- a/docs/release.rst +++ b/docs/release.rst @@ -21,8 +21,12 @@ Unreleased Enhancements ~~~~~~~~~~~~ +* [v3] Reuse the download array metadata when creating an ``Array``. + By :user:`Deepak Cherian `. + * Optimize ``Array.info`` so that it calls `getsize` only once. By :user:`Deepak Cherian `. + * Override IPython ``_repr_*_`` methods to avoid expensive lookups against object stores. By :user:`Deepak Cherian ` :issue:`1716`. diff --git a/zarr/attrs.py b/zarr/attrs.py index e967c5b853..2afcaf295e 100644 --- a/zarr/attrs.py +++ b/zarr/attrs.py @@ -25,14 +25,16 @@ class Attributes(MutableMapping): """ - def __init__(self, store, key=".zattrs", read_only=False, cache=True, synchronizer=None): + def __init__( + self, store, key=".zattrs", read_only=False, cache=True, synchronizer=None, cached_dict=None + ): self._version = getattr(store, "_store_version", 2) _Store = Store if self._version == 2 else StoreV3 self.store = _Store._ensure_store(store) self.key = key self.read_only = read_only self.cache = cache - self._cached_asdict = None + self._cached_asdict = cached_dict if cache else None self.synchronizer = synchronizer def _get_nosync(self): diff --git a/zarr/core.py b/zarr/core.py index 07f38cd96d..1bd081acee 100644 --- a/zarr/core.py +++ b/zarr/core.py @@ -172,7 +172,12 @@ def __init__( # initialize attributes akey = _prefix_to_attrs_key(self._store, self._key_prefix) self._attrs = Attributes( - store, key=akey, read_only=read_only, synchronizer=synchronizer, cache=cache_attrs + store, + key=akey, + read_only=read_only, + synchronizer=synchronizer, + cache=cache_attrs, + cached_dict=self._meta["attributes"] if self._version == 3 else None, ) # initialize info reporter diff --git a/zarr/hierarchy.py b/zarr/hierarchy.py index c5f7a37bc6..783a851f14 100644 --- a/zarr/hierarchy.py +++ b/zarr/hierarchy.py @@ -207,7 +207,12 @@ def __init__( # object can still be created. akey = mkey self._attrs = Attributes( - store, key=akey, read_only=read_only, cache=cache_attrs, synchronizer=synchronizer + store, + key=akey, + read_only=read_only, + cache=cache_attrs, + synchronizer=synchronizer, + cached_dict=self._meta["attributes"] if self._version == 3 and self._meta else None, ) # setup info