Add simple tests for __import__ for future optimizations to importlib.
This commit is contained in:
parent
ded31c47af
commit
6ae7a7d13d
|
@ -0,0 +1,82 @@
|
|||
from . import util
|
||||
from .source import util as source_util
|
||||
import gc
|
||||
import decimal
|
||||
import imp
|
||||
import importlib
|
||||
import sys
|
||||
import timeit
|
||||
|
||||
|
||||
def bench_cache(import_, repeat, number):
|
||||
"""Measure the time it takes to pull from sys.modules."""
|
||||
name = '<benchmark import>'
|
||||
with util.uncache(name):
|
||||
module = imp.new_module(name)
|
||||
sys.modules[name] = module
|
||||
runs = []
|
||||
for x in range(repeat):
|
||||
start_time = timeit.default_timer()
|
||||
for y in range(number):
|
||||
import_(name)
|
||||
end_time = timeit.default_timer()
|
||||
runs.append(end_time - start_time)
|
||||
return min(runs)
|
||||
|
||||
|
||||
def bench_importing_source(import_, repeat, number, loc=100000):
|
||||
"""Measure importing source from disk.
|
||||
|
||||
For worst-case scenario, the line endings are \\r\\n and thus require
|
||||
universal newline translation.
|
||||
|
||||
"""
|
||||
name = '__benchmark'
|
||||
with source_util.create_modules(name) as mapping:
|
||||
with open(mapping[name], 'w') as file:
|
||||
for x in range(loc):
|
||||
file.write("{0}\r\n".format(x))
|
||||
with util.import_state(path=[mapping['.root']]):
|
||||
runs = []
|
||||
for x in range(repeat):
|
||||
start_time = timeit.default_timer()
|
||||
for y in range(number):
|
||||
try:
|
||||
import_(name)
|
||||
finally:
|
||||
del sys.modules[name]
|
||||
end_time = timeit.default_timer()
|
||||
runs.append(end_time - start_time)
|
||||
return min(runs)
|
||||
|
||||
|
||||
def main(import_):
|
||||
args = [('sys.modules', bench_cache, 5, 500000),
|
||||
('source', bench_importing_source, 5, 10000)]
|
||||
test_msg = "{test}, {number} times (best of {repeat}):"
|
||||
result_msg = "{result:.2f} secs"
|
||||
gc.disable()
|
||||
try:
|
||||
for name, meth, repeat, number in args:
|
||||
result = meth(import_, repeat, number)
|
||||
print(test_msg.format(test=name, repeat=repeat,
|
||||
number=number).ljust(40),
|
||||
result_msg.format(result=result).rjust(10))
|
||||
finally:
|
||||
gc.enable()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import optparse
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
parser.add_option('-b', '--builtin', dest='builtin', action='store_true',
|
||||
default=False, help="use the built-in __import__")
|
||||
options, args = parser.parse_args()
|
||||
if args:
|
||||
raise RuntimeError("unrecognized args: {0}".format(args))
|
||||
import_ = __import__
|
||||
if not options.builtin:
|
||||
import_ = importlib.__import__
|
||||
|
||||
main(import_)
|
Loading…
Reference in New Issue