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.
This commit is contained in:
Shantanu 2024-01-29 01:30:22 -08:00 committed by GitHub
parent d7d0d13cd3
commit 2124a3ddcc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 9 additions and 2 deletions

View file

@ -13,7 +13,7 @@
'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]

View file

@ -1,7 +1,6 @@
import os
import re
import abc
import csv
import sys
import json
import email
@ -478,6 +477,10 @@ def make_file(name, hash=None, size_str=None):
@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

View file

@ -0,0 +1 @@
Improve import time of :mod:`importlib.metadata` and :mod:`email.utils`.