Merge pull request #3258 from SimonPersson/performance-2388

Improvements to query performance
This commit is contained in:
Adrian Sampson 2019-05-09 14:15:15 -04:00
commit 38bbb7de1d
5 changed files with 24 additions and 8 deletions

View file

@ -25,7 +25,7 @@ import sqlite3
import contextlib
import beets
from beets.util.functemplate import Template
from beets.util import functemplate
from beets.util import py3_path
from beets.dbcore import types
from .query import MatchQuery, NullSort, TrueQuery
@ -597,7 +597,7 @@ class Model(object):
"""
# Perform substitution.
if isinstance(template, six.string_types):
template = Template(template)
template = functemplate.template(template)
return template.substitute(self.formatted(for_path),
self._template_funcs())

View file

@ -31,7 +31,7 @@ from beets import plugins
from beets import util
from beets.util import bytestring_path, syspath, normpath, samefile, \
MoveOperation
from beets.util.functemplate import Template
from beets.util.functemplate import template, Template
from beets import dbcore
from beets.dbcore import types
import beets
@ -855,7 +855,7 @@ class Item(LibModel):
if isinstance(path_format, Template):
subpath_tmpl = path_format
else:
subpath_tmpl = Template(path_format)
subpath_tmpl = template(path_format)
# Evaluate the selected template.
subpath = self.evaluate_template(subpath_tmpl, True)
@ -1134,7 +1134,7 @@ class Album(LibModel):
image = bytestring_path(image)
item_dir = item_dir or self.item_dir()
filename_tmpl = Template(
filename_tmpl = template(
beets.config['art_filename'].as_str())
subpath = self.evaluate_template(filename_tmpl, True)
if beets.config['asciify_paths']:

View file

@ -36,7 +36,7 @@ from beets import logging
from beets import library
from beets import plugins
from beets import util
from beets.util.functemplate import Template
from beets.util.functemplate import template
from beets import config
from beets.util import confit, as_string
from beets.autotag import mb
@ -616,7 +616,7 @@ def get_path_formats(subview=None):
subview = subview or config['paths']
for query, view in subview.items():
query = PF_KEY_QUERIES.get(query, query) # Expand common queries.
path_formats.append((query, Template(view.as_str())))
path_formats.append((query, template(view.as_str())))
return path_formats

View file

@ -35,6 +35,7 @@ import dis
import types
import sys
import six
import functools
SYMBOL_DELIM = u'$'
FUNC_DELIM = u'%'
@ -553,8 +554,20 @@ def _parse(template):
return Expression(parts)
# External interface.
# Decorator that enables lru_cache on py3, and no caching on py2.
def cached(func):
if six.PY2:
# Sorry python2 users, no caching for you :(
return func
return functools.lru_cache(maxsize=128)(func)
@cached
def template(fmt):
return Template(fmt)
# External interface.
class Template(object):
"""A string template, including text, Symbols, and Calls.
"""

View file

@ -117,6 +117,9 @@ Some improvements have been focused on improving beets' performance:
to be displayed.
Thanks to :user:`pprkut`.
:bug:`3089`
* Querying the library was further improved by reusing compiled teamplates
instead of compiling them over and over again.
Thanks to :user:`SimonPersson`.
* :doc:`/plugins/absubmit`, :doc:`/plugins/badfiles`: Analysis now works in
parallel (on Python 3 only).
Thanks to :user:`bemeurer`.