bpo-29585: optimize site.py startup time (GH-136) · python/cpython@a8f8d5b (original) (raw)
`@@ -124,7 +124,7 @@ def removeduppaths():
`
124
124
`# if they only differ in case); turn relative paths into absolute
`
125
125
`# paths.
`
126
126
`dir, dircase = makepath(dir)
`
127
``
`-
if not dircase in known_paths:
`
``
127
`+
if dircase not in known_paths:
`
128
128
`L.append(dir)
`
129
129
`known_paths.add(dircase)
`
130
130
`sys.path[:] = L
`
`@@ -234,6 +234,46 @@ def check_enableusersite():
`
234
234
``
235
235
`return True
`
236
236
``
``
237
+
``
238
`+
NOTE: sysconfig and it's dependencies are relatively large but site module
`
``
239
`+
needs very limited part of them.
`
``
240
`+
To speedup startup time, we have copy of them.
`
``
241
`+
`
``
242
`+
See https://bugs.python.org/issue29585
`
``
243
+
``
244
`+
Copy of sysconfig._getuserbase()
`
``
245
`+
def _getuserbase():
`
``
246
`+
env_base = os.environ.get("PYTHONUSERBASE", None)
`
``
247
`+
if env_base:
`
``
248
`+
return env_base
`
``
249
+
``
250
`+
def joinuser(*args):
`
``
251
`+
return os.path.expanduser(os.path.join(*args))
`
``
252
+
``
253
`+
if os.name == "nt":
`
``
254
`+
base = os.environ.get("APPDATA") or "~"
`
``
255
`+
return joinuser(base, "Python")
`
``
256
+
``
257
`+
if sys.platform == "darwin" and sys._framework:
`
``
258
`+
return joinuser("~", "Library", sys._framework,
`
``
259
`+
"%d.%d" % sys.version_info[:2])
`
``
260
+
``
261
`+
return joinuser("~", ".local")
`
``
262
+
``
263
+
``
264
`+
Same to sysconfig.get_path('purelib', os.name+'_user')
`
``
265
`+
def _get_path(userbase):
`
``
266
`+
version = sys.version_info
`
``
267
+
``
268
`+
if os.name == 'nt':
`
``
269
`+
return f'{userbase}/Python{version[0]}{version[1]}/site-packages'
`
``
270
+
``
271
`+
if sys.platform == 'darwin' and sys._framework:
`
``
272
`+
return f'{userbase}/lib/python/site-packages'
`
``
273
+
``
274
`+
return f'{userbase}/lib/python{version[0]}.{version[1]}/site-packages'
`
``
275
+
``
276
+
237
277
`def getuserbase():
`
238
278
`` """Returns the user base
directory path.
``
239
279
``
`@@ -242,33 +282,23 @@ def getuserbase():
`
242
282
` it.
`
243
283
` """
`
244
284
`global USER_BASE
`
245
``
`-
if USER_BASE is not None:
`
246
``
`-
return USER_BASE
`
247
``
`-
from sysconfig import get_config_var
`
248
``
`-
USER_BASE = get_config_var('userbase')
`
``
285
`+
if USER_BASE is None:
`
``
286
`+
USER_BASE = _getuserbase()
`
249
287
`return USER_BASE
`
250
288
``
``
289
+
251
290
`def getusersitepackages():
`
252
291
`"""Returns the user-specific site-packages directory path.
`
253
292
``
254
293
``` If the global variable USER_SITE
is not initialized yet, this
```
255
294
` function will also set it.
`
256
295
` """
`
257
296
`global USER_SITE
`
258
``
`-
user_base = getuserbase() # this will also set USER_BASE
`
259
``
-
260
``
`-
if USER_SITE is not None:
`
261
``
`-
return USER_SITE
`
262
``
-
263
``
`-
from sysconfig import get_path
`
``
297
`+
userbase = getuserbase() # this will also set USER_BASE
`
264
298
``
265
``
`-
if sys.platform == 'darwin':
`
266
``
`-
from sysconfig import get_config_var
`
267
``
`-
if get_config_var('PYTHONFRAMEWORK'):
`
268
``
`-
USER_SITE = get_path('purelib', 'osx_framework_user')
`
269
``
`-
return USER_SITE
`
``
299
`+
if USER_SITE is None:
`
``
300
`+
USER_SITE = _get_path(userbase)
`
270
301
``
271
``
`-
USER_SITE = get_path('purelib', '%s_user' % os.name)
`
272
302
`return USER_SITE
`
273
303
``
274
304
`def addusersitepackages(known_paths):
`
`@@ -310,15 +340,11 @@ def getsitepackages(prefixes=None):
`
310
340
`else:
`
311
341
`sitepackages.append(prefix)
`
312
342
`sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
`
313
``
`-
if sys.platform == "darwin":
`
314
``
`-
for framework builds only we add the standard Apple
`
315
``
`-
locations.
`
316
``
`-
from sysconfig import get_config_var
`
317
``
`-
framework = get_config_var("PYTHONFRAMEWORK")
`
318
``
`-
if framework:
`
319
``
`-
sitepackages.append(
`
320
``
`-
os.path.join("/Library", framework,
`
321
``
`-
'%d.%d' % sys.version_info[:2], "site-packages"))
`
``
343
`+
for framework builds only we add the standard Apple locations.
`
``
344
`+
if sys.platform == "darwin" and sys._framework:
`
``
345
`+
sitepackages.append(
`
``
346
`+
os.path.join("/Library", framework,
`
``
347
`+
'%d.%d' % sys.version_info[:2], "site-packages"))
`
322
348
`return sitepackages
`
323
349
``
324
350
`def addsitepackages(known_paths, prefixes=None):
`