Skip to content

Speed up TypeQuery #7128

Open
Open

Description

@JukkaL

mypy.type_visitor.TypeQuery is constructed often with the any or all builtin function as an argument. The function is used as a callable inside the query. Calling callable variables is kind of slow when compiled with mypyc. Since type queries are used a lot, switching to an integer constant or a compiled object instead of a callable could speed up runtimes measurably, perhaps by as much as 0.5% or so (random guess). Since the optimization is pretty simple, this may be worth doing.

Discussion:

  • Maybe have separate type query visitor which produces boolean values. The strategy could be specified as an integer constant.
  • For non-bool type queries, experiment with using an object instead of a callable for the strategy, since callables are currently pretty slow when compiled.
  • Maybe also special case self.strategy([]) since it's used a lot.

Activity

  1. mridullpandey commented on Feb 24, 2020

    @mridullpandey

    hi @JukkaL i want to work on can you assign it to me
    thanks :-)

  2. mridullpandey commented on Feb 24, 2020

    @mridullpandey

    can you please let me know how to get started

  3. JukkaL commented on Feb 28, 2020

    @JukkaL
    CollaboratorAuthor

    @mridullpandey I've assigned this to you. Here are some hints:

    • Figure out how to run mypy in compiled mode so that you can see whether you've improved performance. A good benchmark is type checking mypy. You need to figure out a way to measure the time consistently with accuracy of about 0.2% to validate whether you've made progress (or that at least you haven't regressed anything). Victor Stinner has written about how to do stable benchmarking, in case you want to learn about this.
    • Create a copy of TypeQuery that is specialized for bool instead of accepting an arbitrary type.
    • Replace the strategy constructor argument with an integer constant (corresponding to either any or all).
    • Implement a strategy method that uses the integer constant to implement whatever is needed.
  4. vbarbaresi commented on Oct 17, 2020

    @vbarbaresi
    Contributor

    I just opened a PR with my attempt at TypeQuery specialized for bool

    In your first description of the issue, you wrote:

    For non-bool type queries, experiment with using an object instead of a callable for the strategy, since callables are currently pretty slow when compiled.

    I wanted to try that out too.
    You mean replacing strategy type here

    def __init__(self, strategy: Callable[[Iterable[T]], T]) -> None:

    by a new type of object that can be compiled by mypyc? There would still have to be a callable method someplace in that object, right?

  5. Hyperion101010 commented on Mar 10, 2021

    @Hyperion101010

    Hi there I am Shivam, I know Python to an intermediate level,
    I am interested to solve this issue, will you assign me?

  6. JukkaL commented on Mar 10, 2021

    @JukkaL
    CollaboratorAuthor

    @Hyperion101010 There already is an open PR here: #9604. However, it's not clear if it speeds things up significantly. If you want to help, you can try measuring the impact of the PR on performance. Note that if the difference is small, you may need a specialized environment, such as a machine where you've turned off turbo boost for a constant CPU frequency, and where you've disabled most background processes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions