mirror of
https://github.com/python/cpython
synced 2024-10-14 09:58:30 +00:00
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:
parent
d7d0d13cd3
commit
2124a3ddcc
|
@ -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]
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Improve import time of :mod:`importlib.metadata` and :mod:`email.utils`.
|
Loading…
Reference in a new issue