Pickle raw tuples in FileData cache (#3877)
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
This commit is contained in:
parent
f7917453c9
commit
751583a1df
@ -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 -->
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user