Skip to content

Implement ABCMeta in C #75514

Closed
Closed

Description

@ilevkivskyi
BPO 31333
Nosy @gvanrossum, @warsaw, @brettcannon, @terryjreedy, @scoder, @vstinner, @ned-deily, @methane, @ericsnowcurrently, @serhiy-storchaka, @1st1, @ilevkivskyi, @aaronchall, @miss-islington
PRs
  • bpo-31333: Re-implement ABCMeta in C #5273
  • [3.7] bpo-31333: Re-implement ABCMeta in C (GH-5273) #5733
  • bpo-31333: Fix typo in whatsnew/3.7.rst #5744
  • [3.7] bpo-31333: Fix typo in whatsnew/3.7.rst (GH-5744) #5745
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2018-02-18.12:49:52.291>
    created_at = <Date 2017-09-03.20:54:21.774>
    labels = ['deferred-blocker', '3.8', 'performance', 'extension-modules', '3.7', 'library']
    title = 'Implement ABCMeta in C'
    updated_at = <Date 2018-02-18.22:35:42.221>
    user = 'https://github.com/ilevkivskyi'

    bugs.python.org fields:

    activity = <Date 2018-02-18.22:35:42.221>
    actor = 'miss-islington'
    assignee = 'none'
    closed = True
    closed_date = <Date 2018-02-18.12:49:52.291>
    closer = 'levkivskyi'
    components = ['Extension Modules', 'Library (Lib)']
    creation = <Date 2017-09-03.20:54:21.774>
    creator = 'levkivskyi'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 31333
    keywords = ['patch']
    message_count = 18.0
    messages = ['301198', '301236', '301241', '301290', '301293', '301301', '301302', '310998', '310999', '312284', '312285', '312287', '312306', '312315', '312323', '312327', '312329', '312331']
    nosy_count = 14.0
    nosy_names = ['gvanrossum', 'barry', 'brett.cannon', 'terry.reedy', 'scoder', 'vstinner', 'ned.deily', 'methane', 'eric.snow', 'serhiy.storchaka', 'yselivanov', 'levkivskyi', 'Aaron Hall', 'miss-islington']
    pr_nums = ['5273', '5733', '5744', '5745']
    priority = 'deferred blocker'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'performance'
    url = 'https://bugs.python.org/issue31333'
    versions = ['Python 3.7', 'Python 3.8']

    Activity

    1. ilevkivskyi commented on Sep 3, 2017

      @ilevkivskyi
      MemberAuthor

      The idea is that creating ABCs is approximately twice slower than normal classes. Plus there are smaller penalties for various operations with ABCs. This mostly influences the Python interpreter start-up time (because of extensive use of ABCs in importlib), and start-up times of programs that extensively use ABCs.

      The situation can be improved by rewriting ABCMeta in C. I have a working implementation, but it is far form being ready and still needs some polishing and optimizations (in particular _abc_cache and friends).

      Already at this stage I have one question (I will add more when they appear while I am finishing the implementation): is it OK to make _abc_cache, _abc_negative_cache, _abc_negative_cache_version, and _abc_registry read-only? The point is that I want to prohibit something like this:

          MyABC._abc_cache = "Surprise on updating the cache!"

      thus avoiding many PySet_Check(...) calls. These attributes are not documented and start with underscore.

    2. added
      stdlibStandard Library Python modules in the Lib/ directory
      performancePerformance or resource usage
      on Sep 3, 2017
    3. ericsnowcurrently commented on Sep 4, 2017

      @ericsnowcurrently
      Member

      This mostly influences the Python interpreter start-up time
      (because of extensive use of ABCs in importlib)

      Just to be clear, the only ABCs in importlib are in importlib.abc (and used by importlib.util). This does not impact interpreter startup.

    4. ilevkivskyi commented on Sep 4, 2017

      @ilevkivskyi
      MemberAuthor

      Eric,

      the only ABCs in importlib are in importlib.abc (and used by importlib.util).
      This does not impact interpreter startup.

      Hm, indeed, but I see that module 'abc' is in 'sys.modules', probably it is then only used by 'collections.abc'/'_collections_abc'. This means that the influence of 'ABCMeta' on interpreter start-up time will be smaller than I thought. But still start-up times for projects that actively use ABCs will be influenced by 'ABCMeta'.

      But what do you think about making private ABC caches read-only attributes? (They are not documented)

    5. gvanrossum commented on Sep 5, 2017

      @gvanrossum
      Member

      I've heard many anecdotal complaints about the lack of speed of ABCs. Even if it doesn't affect core Python startup, it does affect startup of apps, and if people are afraid to use them because of this, it's reasonable to try to do something about it.

    6. methane commented on Sep 5, 2017

      @methane
      Member

      Hm, indeed, but I see that module 'abc' is in 'sys.modules', probably it is then only used by 'collections.abc'/'_collections_abc'. This means that the influence of 'ABCMeta' on interpreter start-up time will be smaller than I thought. But still start-up times for projects that actively use ABCs will be influenced by 'ABCMeta'.

      Since os.environ uses _collections_abc.MutableMapping, importing _collections_abc is not avoidable while startup.

      io module uses ABC and it's used for sys.std(io|err|in). It's not avoidable too.

      And as you know, typing module will be very common rapidly :)
      Even if it doesn't affect "python_startup" microbench, it's important.

    7. scoder commented on Sep 5, 2017

      @scoder
      Contributor

      Since the number of applications that get along without any file access is probably close to irrelevant, "os" and "io" feel like sufficiently widely used modules to merit being part of a "usual Python startup" benchmark. Maybe we should add one to the benchmark suite? Anyone up for it?

    8. methane commented on Sep 5, 2017

      @methane
      Member

      "python_startup_nosite" benchmark imports io module,
      and "python_startup" benchmark imports os too.
      So no need to additional test for them.

      You can see it with python -v -S -c 'pass' and python -v -c 'pass'.

    9. ned-deily commented on Jan 28, 2018

      @ned-deily
      Member

      There has been a lot of work by a number of people on this feature leading up to the 3.7.0b1. Thank you! On PR 5273, Yury says that he believes the feature is ready to merge but would prefer an extension until 3.7.0b2 and that Guido has agreed. I'll defer to Yury's judgement on this and somewhat reluctantly allow an extension: there's a lot going on here. Let's try to get it in as soon as we can, please!

    10. 1st1 commented on Jan 28, 2018

      @1st1
      Member

      Let's try to get it in as soon as we can, please!

      Thank you, Ned! We'll get it merged in the next few days.

    11. serhiy-storchaka commented on Feb 17, 2018

      @serhiy-storchaka
      Member

      Isn't 800 lines of C code too high price for speeding up ABCs creation? This will save several microseconds per ABC creation. Even if the program creates 1000 ABCs, this can save just several milliseconds at start-up.

    12. ilevkivskyi commented on Feb 17, 2018

      @ilevkivskyi
      MemberAuthor

      Isn't 800 lines of C code too high price for speeding up ABCs creation?

      800 lines of C code is not something hard to notice, so I suppose the answer is obvious for all people involved in the work on PR :-)

      ...this can save just several milliseconds at start-up.

      The correct way to measure this is relative, not absolute. There are just few ABCs used by modules loaded at Python start-up, and it already allowed to save 10% of start-up time. My expectation is that the number will be similar for a typical Python app. Moreover, isinstance and issubclass (functions called often with ABCs) will be 1.5x faster.

    13. gvanrossum commented on Feb 17, 2018

      @gvanrossum
      Member

      Isn't 800 lines of C code too high price for speeding up ABCs creation?

      I think it's well worth it. This has long felt as a sore point to me.

      On Sat, Feb 17, 2018 at 10:27 AM, Ivan Levkivskyi <[email protected]>
      wrote:

      Ivan Levkivskyi [email protected] added the comment:

      Isn't 800 lines of C code too high price for speeding up ABCs creation?

      800 lines of C code is not something hard to notice, so I suppose the
      answer is obvious for all people involved in the work on PR :-)

      ...this can save just several milliseconds at start-up.

      The correct way to measure this is relative, not absolute. There are just
      few ABCs used by modules loaded at Python start-up, and it already allowed
      to save 10% of start-up time. My expectation is that the number will be
      similar for a typical Python app. Moreover, isinstance and issubclass
      (functions called often with ABCs) will be 1.5x faster.

      ----------


      Python tracker <[email protected]>
      <https://bugs.python.org/issue31333\>


    14. ilevkivskyi commented on Feb 18, 2018

      @ilevkivskyi
      MemberAuthor

      New changeset 03e3c34 by Ivan Levkivskyi in branch 'master':
      bpo-31333: Re-implement ABCMeta in C (bpo-5273)
      03e3c34

    15. ilevkivskyi commented on Feb 18, 2018

      @ilevkivskyi
      MemberAuthor

      New changeset 3892899 by Ivan Levkivskyi in branch '3.7':
      bpo-31333: Re-implement ABCMeta in C (GH-5733)
      3892899

    16. gvanrossum commented on Feb 18, 2018

      @gvanrossum
      Member

      Congratulations all on this milestone! And thanks reviewers for your thorough work.

    17. terryjreedy commented on Feb 18, 2018

      @terryjreedy
      Member

      PR fixes typo in What's new: rewrittent

    18. ilevkivskyi commented on Feb 18, 2018

      @ilevkivskyi
      MemberAuthor

      New changeset 3fb813d by Ivan Levkivskyi (Terry Jan Reedy) in branch 'master':
      bpo-31333: Fix typo in whatsnew/3.7.rst (GH-5744)
      3fb813d

    19. miss-islington commented on Feb 18, 2018

      @miss-islington
      Contributor

      New changeset 034a945 by Miss Islington (bot) in branch '3.7':
      bpo-31333: Fix typo in whatsnew/3.7.rst (GH-5744)
      034a945

    20. transferred this issue fromon Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions