Skip to content

Commit

Permalink
Pickle raw tuples in FileData cache (#3877)
Browse files Browse the repository at this point in the history
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
  • Loading branch information
JelleZijlstra and cdce8p authored Sep 10, 2023
1 parent f791745 commit 751583a
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
3 changes: 3 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@

<!-- Changes that improve Black's performance. -->

- Store raw tuples instead of NamedTuples in Black's cache, improving performance and
decreasing the size of the cache (#3877)

### Output

<!-- Changes to Black's terminal output and error messages -->
Expand Down
10 changes: 8 additions & 2 deletions src/black/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ def read(cls, mode: Mode) -> Self:

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)

Expand Down Expand Up @@ -129,7 +130,12 @@ def write(self, sources: Iterable[Path]) -> None:
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

0 comments on commit 751583a

Please sign in to comment.