-
-
Notifications
You must be signed in to change notification settings - Fork 30.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-29585: optimize site.py startup time #136
Conversation
Since 'PYTHONFRAMEWORK' is in sysconfigdata, I cannot stop importing them. |
4f58b0c
to
483769e
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a major change: by duplicating code from sysconfig.py into site.py, there would now be a implicit link between the two and a potential maintenance problem. If we were to do this, there should at least be mention of these duplications in sysconfig.py and/or tests for the duplicated behavior. Also, there should be a b.p.o issue for this proposed change.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I dislike this approach. I suggest to experiment a _site extension module: see the issue.
I've addes |
dfeced1
to
45f5e9a
Compare
45f5e9a
to
07369f1
Compare
Skip importing sysconfig when possible. Median +- std dev: [default] 15.8 ms +- 0.0 ms -> [patched] 14.7 ms +- 0.0 ms: 1.07x faster (-7%)
75b4c6c
to
ff0d05c
Compare
@ned-deily I created bpo issue and added comment about duplicated code. |
A quick & dirty benchmark using my perf module: I see an improvement of -0.8 ms (1.05x faster) on Python startup time.
EDIT: this benchmark was run on my Linux laptop. |
Hum, did I miss something? sysconfig is still imported by the site module on macOS by getsitepackages():
macbook:master haypo$ ./python.exe -c 'import sys; print("sysconfig" in sys.modules)' I suggest this additionnal change:
With this additionnal change, the speedup on macOS is quite significant: -13.4 ms (1.61x faster)!
cc @1st1: Yury, since you use macOS, you probably want to see this change merged :-) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
New review.
Lib/site.py
Outdated
@@ -234,6 +234,27 @@ def check_enableusersite(): | |||
|
|||
return True | |||
|
|||
|
|||
def _getuserbase(): | |||
# Stripped version of sysconfig._getuserbase() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please elaborate this comment? Please explain that the function was duplicated to speedup Python startup and avoid the sysconfig import in the site module. Add a reference to the bpo 29585.
It seems like you modified this change: you moved "if env_base: return env_base" at the top. Please modify also sysconfig._getuserbase(). I would also prefer the sysconfig also uses sys._framework, instead of get_config_var("PYTHONFRAMEWORK").
Lib/site.py
Outdated
|
||
def _get_path(userbase): | ||
# stripped version of sysconfig.get_path('purelib', os.name + '_user') | ||
version = sys.version_info[:2] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is [:2] really needed?
Lib/site.py
Outdated
return USER_BASE | ||
|
||
|
||
def _get_path(userbase): | ||
# stripped version of sysconfig.get_path('purelib', os.name + '_user') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Again, please elaborate the comment. (Maybe point to _getuserbase() above?)
Ned Deily: "This is a major change: by duplicating code from sysconfig.py into site.py, there would now be a implicit link between the two and a potential maintenance problem. If we were to do this, there should at least be mention of these duplications in sysconfig.py and/or tests for the duplicated behavior." @methane added a comment in sysconfig.py, IMHO it's enough. About testing: @methane, can you try to write a test to check that site and sysconfig return the same value for the two private functions? You may have to tag the unit test with @cpython_only, since the two new site functions are private. Ned Deily: "Also, there should be a b.p.o issue for this proposed change." Done. Since most Ned's requests are done, I dismiss his review. |
Except of my minor commits, I now like the overall shape of the PR. I now agree that writing a new _site module is not necessary, it's better to keep all code in the site.py file. |
On macOS, performance gain is more impressive than Linux:
|
Oh, I'm sorry. I missed your above comment. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, but I would like to see an answer to the question on tests (check that site functions return the same result than sysconfig?) before approving your change :-)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! The latest change is much better than the first iteration, and it now LGTM!
Thank you for review. |
Why couldn't we make 'sysconfig' to import a couple of private functions from 'site', why copying? |
It's not a pure copy/paste, one function is specialized for site use case. I dislike the idea of importing site code from sysconfig. |
Thanks for this cool and cheap speedup! |
Ah, I've missed build failure on Windows. |
Oh, Windows build is broken :-(
Need to fix PC/pyconfig.h? |
Oh, AppVeyor didn't catch the bug simply because it wasn't run on this PR! |
Python 3 has no xrange.
Skip importing sysconfig when possible.
Median +- std dev: [default] 15.8 ms +- 0.0 ms -> [patched] 14.7 ms +- 0.0 ms: 1.07x faster (-7%)
(bpo-29585)