From 751583a1dfc691423d96d7711a4c8d9cfe3ee9c8 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sun, 10 Sep 2023 16:16:24 -0700 Subject: [PATCH] Pickle raw tuples in FileData cache (#3877) Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com> --- CHANGES.md | 3 +++ src/black/cache.py | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1334efe..9fa14f3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -32,6 +32,9 @@ +- Store raw tuples instead of NamedTuples in Black's cache, improving performance and + decreasing the size of the cache (#3877) + ### Output diff --git a/src/black/cache.py b/src/black/cache.py index ff15da2..77f66cc 100644 --- a/src/black/cache.py +++ b/src/black/cache.py @@ -67,7 +67,8 @@ class Cache: with cache_file.open("rb") as fobj: try: - file_data: Dict[str, FileData] = pickle.load(fobj) + data: Dict[str, Tuple[float, int, str]] = pickle.load(fobj) + file_data = {k: FileData(*v) for k, v in data.items()} except (pickle.UnpicklingError, ValueError, IndexError): return cls(mode, cache_file) @@ -129,7 +130,12 @@ class Cache: with tempfile.NamedTemporaryFile( dir=str(self.cache_file.parent), delete=False ) as f: - pickle.dump(self.file_data, f, protocol=4) + # We store raw tuples in the cache because pickling NamedTuples + # doesn't work with mypyc on Python 3.8, and because it's faster. + data: Dict[str, Tuple[float, int, str]] = { + k: (*v,) for k, v in self.file_data.items() + } + pickle.dump(data, f, protocol=4) os.replace(f.name, self.cache_file) except OSError: pass -- 2.39.2