summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShantanu <12621235+hauntsaninja@users.noreply.github.com>2024-01-29 09:30:22 (GMT)
committerGitHub <noreply@github.com>2024-01-29 09:30:22 (GMT)
commit2124a3ddcc0e274521f74d239f0e94060e17dd7f (patch)
tree893f989eaa97abb8ef56b8977445f605dc4e4ca9
parentd7d0d13cd37651990586d31d8974c59bd25e1045 (diff)
downloadcpython-2124a3ddcc0e274521f74d239f0e94060e17dd7f.zip
cpython-2124a3ddcc0e274521f74d239f0e94060e17dd7f.tar.gz
cpython-2124a3ddcc0e274521f74d239f0e94060e17dd7f.tar.bz2
gh-109653: Improve import time of importlib.metadata / email.utils (#114664)
My criterion for delayed imports is that they're only worth it if the majority of users of the module would benefit from it, otherwise you're just moving latency around unpredictably. mktime_tz is not used anywhere in the standard library and grep.app indicates it's not got much use in the ecosystem either. Distribution.files is not nearly as widely used as other importlib.metadata APIs, so we defer the csv import. Before: ``` λ hyperfine -w 8 './python -c "import importlib.metadata"' Benchmark 1: ./python -c "import importlib.metadata" Time (mean ± σ): 65.1 ms ± 0.5 ms [User: 55.3 ms, System: 9.8 ms] Range (min … max): 64.4 ms … 66.4 ms 44 runs ``` After: ``` λ hyperfine -w 8 './python -c "import importlib.metadata"' Benchmark 1: ./python -c "import importlib.metadata" Time (mean ± σ): 62.0 ms ± 0.3 ms [User: 52.5 ms, System: 9.6 ms] Range (min … max): 61.3 ms … 62.8 ms 46 runs ``` for about a 3ms saving with warm disk cache, maybe 7-11ms with cold disk cache.
-rw-r--r--Lib/email/_parseaddr.py5
-rw-r--r--Lib/importlib/metadata/__init__.py5
-rw-r--r--Misc/NEWS.d/next/Library/2024-01-28-00-48-12.gh-issue-109653.vF4exe.rst1
3 files changed, 9 insertions, 2 deletions
diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
index febe411..0f1bf8e 100644
--- a/Lib/email/_parseaddr.py
+++ b/Lib/email/_parseaddr.py
@@ -13,7 +13,7 @@ __all__ = [
'quote',
]
-import time, calendar
+import time
SPACE = ' '
EMPTYSTRING = ''
@@ -194,6 +194,9 @@ def mktime_tz(data):
# No zone info, so localtime is better assumption than GMT
return time.mktime(data[:8] + (-1,))
else:
+ # Delay the import, since mktime_tz is rarely used
+ import calendar
+
t = calendar.timegm(data)
return t - data[9]
diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py
index 7b142e7..c612fbe 100644
--- a/Lib/importlib/metadata/__init__.py
+++ b/Lib/importlib/metadata/__init__.py
@@ -1,7 +1,6 @@
import os
import re
import abc
-import csv
import sys
import json
import email
@@ -478,6 +477,10 @@ class Distribution(DeprecatedNonAbstract):
@pass_none
def make_files(lines):
+ # Delay csv import, since Distribution.files is not as widely used
+ # as other parts of importlib.metadata
+ import csv
+
return starmap(make_file, csv.reader(lines))
@pass_none
diff --git a/Misc/NEWS.d/next/Library/2024-01-28-00-48-12.gh-issue-109653.vF4exe.rst b/Misc/NEWS.d/next/Library/2024-01-28-00-48-12.gh-issue-109653.vF4exe.rst
new file mode 100644
index 0000000..fb33820
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-01-28-00-48-12.gh-issue-109653.vF4exe.rst
@@ -0,0 +1 @@
+Improve import time of :mod:`importlib.metadata` and :mod:`email.utils`.