Skip to content

Commit 2124a3d

Browse files
authored
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.
1 parent d7d0d13 commit 2124a3d

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

Lib/email/_parseaddr.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
'quote',
1414
]
1515

16-
import time, calendar
16+
import time
1717

1818
SPACE = ' '
1919
EMPTYSTRING = ''
@@ -194,6 +194,9 @@ def mktime_tz(data):
194194
# No zone info, so localtime is better assumption than GMT
195195
return time.mktime(data[:8] + (-1,))
196196
else:
197+
# Delay the import, since mktime_tz is rarely used
198+
import calendar
199+
197200
t = calendar.timegm(data)
198201
return t - data[9]
199202

Lib/importlib/metadata/__init__.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import os
22
import re
33
import abc
4-
import csv
54
import sys
65
import json
76
import email
@@ -478,6 +477,10 @@ def make_file(name, hash=None, size_str=None):
478477

479478
@pass_none
480479
def make_files(lines):
480+
# Delay csv import, since Distribution.files is not as widely used
481+
# as other parts of importlib.metadata
482+
import csv
483+
481484
return starmap(make_file, csv.reader(lines))
482485

483486
@pass_none
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve import time of :mod:`importlib.metadata` and :mod:`email.utils`.

0 commit comments

Comments
 (0)