Repository navigation
Closed
Labels
3.7 (EOL)end of lifeend of life3.8 (EOL)end of lifeend of lifedeferred-blockerextension-modulesC modules in the Modules dirC modules in the Modules dirperformancePerformance or resource usagePerformance or resource usagestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directory
Description
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']Metadata
Metadata
Assignees
Labels
3.7 (EOL)end of lifeend of life3.8 (EOL)end of lifeend of lifedeferred-blockerextension-modulesC modules in the Modules dirC modules in the Modules dirperformancePerformance or resource usagePerformance or resource usagestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directory
Activity
ilevkivskyi commentedon Sep 3, 2017
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:
thus avoiding many PySet_Check(...) calls. These attributes are not documented and start with underscore.
ericsnowcurrently commentedon Sep 4, 2017
Just to be clear, the only ABCs in importlib are in importlib.abc (and used by importlib.util). This does not impact interpreter startup.
ilevkivskyi commentedon Sep 4, 2017
Eric,
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)
gvanrossum commentedon Sep 5, 2017
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.
methane commentedon Sep 5, 2017
Since os.environ uses _collections_abc.MutableMapping, importing _collections_abc is not avoidable while startup.
iomodule 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.
scoder commentedon Sep 5, 2017
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?
methane commentedon Sep 5, 2017
"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'andpython -v -c 'pass'.ned-deily commentedon Jan 28, 2018
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!
1st1 commentedon Jan 28, 2018
Thank you, Ned! We'll get it merged in the next few days.
serhiy-storchaka commentedon Feb 17, 2018
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.
ilevkivskyi commentedon Feb 17, 2018
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 :-)
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,
isinstanceandissubclass(functions called often with ABCs) will be 1.5x faster.gvanrossum commentedon Feb 17, 2018
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:
ilevkivskyi commentedon Feb 18, 2018
New changeset 03e3c34 by Ivan Levkivskyi in branch 'master':
bpo-31333: Re-implement ABCMeta in C (bpo-5273)
03e3c34
ilevkivskyi commentedon Feb 18, 2018
New changeset 3892899 by Ivan Levkivskyi in branch '3.7':
bpo-31333: Re-implement ABCMeta in C (GH-5733)
3892899
gvanrossum commentedon Feb 18, 2018
Congratulations all on this milestone! And thanks reviewers for your thorough work.
terryjreedy commentedon Feb 18, 2018
PR fixes typo in What's new: rewrittent
ilevkivskyi commentedon Feb 18, 2018
New changeset 3fb813d by Ivan Levkivskyi (Terry Jan Reedy) in branch 'master':
bpo-31333: Fix typo in whatsnew/3.7.rst (GH-5744)
3fb813d
miss-islington commentedon Feb 18, 2018
New changeset 034a945 by Miss Islington (bot) in branch '3.7':
bpo-31333: Fix typo in whatsnew/3.7.rst (GH-5744)
034a945