Merge pull request #10954 from anntzer/share-dviread-caches · matplotlib/matplotlib@edd053d · GitHub
Skip to content

Commit edd053d

Browse files
authored
Merge pull request #10954 from anntzer/share-dviread-caches
Cache various dviread constructs globally.
2 parents eee8901 + cb58589 commit edd053d

5 files changed

Lines changed: 83 additions & 94 deletions

File tree

doc/api/next_api_changes/2018-02-15-AL-deprecations.rst

Lines changed: 9 additions & 5 deletions

lib/matplotlib/backends/backend_pdf.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -655,14 +655,11 @@ def fontName(self, fontprop):
655655
return Fx
656656

657657
@property
658+
@cbook.deprecated("3.0")
658659
def texFontMap(self):
659660
# lazy-load texFontMap, it takes a while to parse
660661
# and usetex is a relatively rare use case
661-
if self._texFontMap is None:
662-
self._texFontMap = dviread.PsfontsMap(
663-
dviread.find_tex_file('pdftex.map'))
664-
665-
return self._texFontMap
662+
return dviread.PsfontsMap(dviread.find_tex_file('pdftex.map'))
666663

667664
def dviFontName(self, dvifont):
668665
"""
@@ -675,7 +672,8 @@ def dviFontName(self, dvifont):
675672
if dvi_info is not None:
676673
return dvi_info.pdfname
677674

678-
psfont = self.texFontMap[dvifont.texname]
675+
tex_font_map = dviread.PsfontsMap(dviread.find_tex_file('pdftex.map'))
676+
psfont = tex_font_map[dvifont.texname]
679677
if psfont.filename is None:
680678
raise ValueError(
681679
"No usable font file found for {} (TeX: {}); "

lib/matplotlib/dviread.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
# iterate over pages:
1010
for page in dvi:
1111
w, h, d = page.width, page.height, page.descent
12-
for x,y,font,glyph,width in page.text:
12+
for x, y, font, glyph, width in page.text:
1313
fontname = font.texname
1414
pointsize = font.size
1515
...
16-
for x,y,height,width in page.boxes:
16+
for x, y, height, width in page.boxes:
1717
...
18-
1918
"""
19+
2020
from collections import namedtuple
2121
import enum
2222
from functools import lru_cache, partial, wraps
@@ -34,6 +34,10 @@
3434

3535
_log = logging.getLogger(__name__)
3636

37+
# Many dvi related files are looked for by external processes, require
38+
# additional parsing, and are used many times per rendering, which is why they
39+
# are cached using lru_cache().
40+
3741
# Dvi is a bytecode format documented in
3842
# http://mirrors.ctan.org/systems/knuth/dist/texware/dvitype.web
3943
# http://texdoc.net/texmf-dist/doc/generic/knuth/texware/dvitype.pdf
@@ -808,14 +812,14 @@ class PsfontsMap(object):
808812
"""
809813
__slots__ = ('_font', '_filename')
810814

811-
def __init__(self, filename):
815+
@lru_cache()
816+
def __new__(cls, filename):
817+
self = object.__new__(cls)
812818
self._font = {}
813-
self._filename = filename
814-
if isinstance(filename, bytes):
815-
encoding = sys.getfilesystemencoding() or 'utf-8'
816-
self._filename = filename.decode(encoding, errors='replace')
819+
self._filename = os.fsdecode(filename)
817820
with open(filename, 'rb') as file:
818821
self._parse(file)
822+
return self
819823

820824
def __getitem__(self, texname):
821825
assert isinstance(texname, bytes)
@@ -956,7 +960,8 @@ def __init__(self, filename):
956960
def __iter__(self):
957961
yield from self.encoding
958962

959-
def _parse(self, file):
963+
@staticmethod
964+
def _parse(file):
960965
result = []
961966

962967
lines = (line.split(b'%', 1)[0].strip() for line in file)
@@ -975,6 +980,7 @@ def _parse(self, file):
975980
return re.findall(br'/([^][{}<>\s]+)', data)
976981

977982

983+
@lru_cache()
978984
def find_tex_file(filename, format=None):
979985
"""
980986
Find a file in the texmf tree.
@@ -1016,10 +1022,6 @@ def find_tex_file(filename, format=None):
10161022
return result.decode('ascii')
10171023

10181024

1019-
# With multiple text objects per figure (e.g., tick labels) we may end
1020-
# up reading the same tfm and vf files many times, so we implement a
1021-
# simple cache. TODO: is this worth making persistent?
1022-
10231025
@lru_cache()
10241026
def _fontfile(cls, suffix, texname):
10251027
filename = find_tex_file(texname + suffix)

lib/matplotlib/texmanager.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,13 @@
2929
"""
3030

3131
import copy
32-
import distutils.version
3332
import glob
3433
import hashlib
3534
import logging
3635
import os
3736
from pathlib import Path
3837
import re
39-
import shutil
4038
import subprocess
41-
import sys
42-
import warnings
4339

4440
import numpy as np
4541

lib/matplotlib/textpath.py

Lines changed: 55 additions & 66 deletions

0 commit comments

Comments
 (0)