summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo van Kemenade <1324225+hugovk@users.noreply.github.com>2024-11-21 14:55:28 (GMT)
committerGitHub <noreply@github.com>2024-11-21 14:55:28 (GMT)
commitdc7a2b6522ec7af41282bc34f405bee9b306d611 (patch)
tree9b10bbad365095412ea89bcd8d9ea4438849d9e3
parentbab4b0462ebd782dd6965beb0ccae6341af43ceb (diff)
downloadcpython-dc7a2b6522ec7af41282bc34f405bee9b306d611.zip
cpython-dc7a2b6522ec7af41282bc34f405bee9b306d611.tar.gz
cpython-dc7a2b6522ec7af41282bc34f405bee9b306d611.tar.bz2
gh-118761: Improve import time of `mimetypes` (#126979)
-rw-r--r--Lib/mimetypes.py22
-rw-r--r--Misc/NEWS.d/next/Library/2024-11-18-22-02-47.gh-issue-118761.GQKD_J.rst2
2 files changed, 18 insertions, 6 deletions
diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py
index 61cba1a..7532383 100644
--- a/Lib/mimetypes.py
+++ b/Lib/mimetypes.py
@@ -23,11 +23,6 @@ init([files]) -- parse a list of files, default knownfiles (on Windows, the
read_mime_types(file) -- parse one file, return a dictionary or None
"""
-import os
-import sys
-import posixpath
-import urllib.parse
-
try:
from _winapi import _mimetypes_read_windows_registry
except ImportError:
@@ -119,6 +114,10 @@ class MimeTypes:
Optional 'strict' argument when False adds a bunch of commonly found,
but non-standard types.
"""
+ # Lazy import to improve module import time
+ import os
+ import urllib.parse
+
# TODO: Deprecate accepting file paths (in particular path-like objects).
url = os.fspath(url)
p = urllib.parse.urlparse(url)
@@ -146,6 +145,10 @@ class MimeTypes:
if '=' in type or '/' not in type:
type = 'text/plain'
return type, None # never compressed, so encoding is None
+
+ # Lazy import to improve module import time
+ import posixpath
+
return self._guess_file_type(url, strict, posixpath.splitext)
def guess_file_type(self, path, *, strict=True):
@@ -153,6 +156,9 @@ class MimeTypes:
Similar to guess_type(), but takes file path instead of URL.
"""
+ # Lazy import to improve module import time
+ import os
+
path = os.fsdecode(path)
path = os.path.splitdrive(path)[1]
return self._guess_file_type(path, strict, os.path.splitext)
@@ -399,6 +405,9 @@ def init(files=None):
else:
db = _db
+ # Lazy import to improve module import time
+ import os
+
for file in files:
if os.path.isfile(file):
db.read(file)
@@ -445,7 +454,7 @@ def _default_mime_types():
}
# Before adding new types, make sure they are either registered with IANA,
- # at http://www.iana.org/assignments/media-types
+ # at https://www.iana.org/assignments/media-types/media-types.xhtml
# or extensions, i.e. using the x- prefix
# If you add to these, please keep them sorted by mime type.
@@ -646,6 +655,7 @@ _default_mime_types()
def _main():
import getopt
+ import sys
USAGE = """\
Usage: mimetypes.py [options] type
diff --git a/Misc/NEWS.d/next/Library/2024-11-18-22-02-47.gh-issue-118761.GQKD_J.rst b/Misc/NEWS.d/next/Library/2024-11-18-22-02-47.gh-issue-118761.GQKD_J.rst
new file mode 100644
index 0000000..ebb9fe8
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-11-18-22-02-47.gh-issue-118761.GQKD_J.rst
@@ -0,0 +1,2 @@
+Improve import time of :mod:`mimetypes` by around 11-16 times. Patch by Hugo
+van Kemenade.