]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109653: Improve import time of importlib.metadata / email.utils (#114664)
authorShantanu <12621235+hauntsaninja@users.noreply.github.com>
Mon, 29 Jan 2024 09:30:22 +0000 (01:30 -0800)
committerGitHub <noreply@github.com>
Mon, 29 Jan 2024 09:30:22 +0000 (01:30 -0800)
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.

Lib/email/_parseaddr.py
Lib/importlib/metadata/__init__.py
Misc/NEWS.d/next/Library/2024-01-28-00-48-12.gh-issue-109653.vF4exe.rst [new file with mode: 0644]

index febe411355d6be3be8b60bd8c845479451149d6f..0f1bf8e4253ec4b0fd785891a4bdf9e47c02fce8 100644 (file)
@@ -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]
 
index 7b142e786e829efbb53c9af7b3a81194951a54d7..c612fbefee2e8028297018122d080c2094009502 100644 (file)
@@ -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 (file)
index 0000000..fb33820
--- /dev/null
@@ -0,0 +1 @@
+Improve import time of :mod:`importlib.metadata` and :mod:`email.utils`.