Pickle raw tuples in FileData cache (#3877)

Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
This commit is contained in:
Jelle Zijlstra 2023-09-10 16:16:24 -07:00 committed by GitHub
parent f7917453c9
commit 751583a1df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -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 -->

View File

@ -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)
@ -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