Commit 517fc31
committed
Improve performance of inspect.getmodule
getmodule maintains a cache of module names & associated file names.
Whenever it encounters a module filename not in its cache, it iterates
over sys.modules and repopulates its cache.
An object which has no associated module filename will trigger this
repopulation loop every time getmodule is called. The cost is easily
seen with inspect.getstack
def run_test(module):
# cols have stack depths
# rows have len(sys.modules)
def print_line(h, *vals):
if not h:
print("%5s" % h, *["%6i" % v for v in vals])
else:
print("%5s" % h, *["%6.1f" % v for v in vals])
def add_modules(n):
import random
import sys
for _ in range(n):
sys.modules[f"foo_{random.randint(0,2**64)}"] = module
def measure(depth):
import inspect
import timeit
def nest(level):
if level > 0:
return nest(level-1)
else:
dur = timeit.timeit(lambda: inspect.stack(), number=1)
return dur * 1000
return nest(depth)
import sys
print_line("", *[2**e for e in range(7)])
for i in range(1, 5):
add_modules(n=10**i)
times = [measure(depth=2**e) for e in range(7)]
print_line(len(sys.modules), *times)
python 3.11.0a7+ optimized build ====
# sys has no __file__ and doesn't enter getmodule cache
>>> import sys
>>> run_test(sys)
1 2 4 8 16 32 64
87 2.1 0.8 1.0 1.3 2.0 3.3 6.1
187 2.0 2.5 2.7 3.6 5.5 9.5 16.8
1187 13.6 15.7 19.1 26.3 39.6 67.4 123.3
11187 134.1 150.3 183.4 252.0 383.5 750.3 1189.8
>>> exit()
>>> import random
>>> run_test(random)
1 2 4 8 16 32 64
87 2.1 0.7 0.9 1.2 1.7 2.9 5.6
187 2.3 1.1 1.5 1.8 2.5 4.3 7.8
1187 17.0 4.3 5.6 7.1 11.1 18.6 33.9
11187 164.6 37.4 45.7 61.6 94.7 161.0 297.7
>>> exit()
python 3.11.0a7+ optimized build, with changes ====
>>> import sys
>>> run_test(sys)
1 2 4 8 16 32 64
87 1.7 0.2 0.2 0.3 0.4 0.6 1.2
187 0.2 0.2 0.2 0.2 0.3 0.5 0.9
1187 0.2 0.2 0.2 0.3 0.3 0.5 0.9
11187 0.3 0.3 0.3 0.3 0.5 0.8 1.3
>>> exit()
>>> import random
>>> run_test(random)
1 2 4 8 16 32 64
87 1.8 0.2 0.2 0.3 0.4 0.6 1.2
187 0.2 0.2 0.2 0.3 0.3 0.6 0.9
1187 0.2 0.2 0.2 0.3 0.4 0.5 0.9
11187 0.3 0.2 0.2 0.3 0.3 0.6 1.0
>>> exit()1 parent 3f61db4 commit 517fc31
1 file changed
Lines changed: 19 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
907 | 907 | | |
908 | 908 | | |
909 | 909 | | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
910 | 918 | | |
911 | 919 | | |
912 | 920 | | |
| |||
916 | 924 | | |
917 | 925 | | |
918 | 926 | | |
919 | | - | |
920 | | - | |
921 | | - | |
922 | | - | |
| 927 | + | |
923 | 928 | | |
924 | 929 | | |
925 | 930 | | |
| |||
969 | 974 | | |
970 | 975 | | |
971 | 976 | | |
| 977 | + | |
972 | 978 | | |
973 | 979 | | |
974 | 980 | | |
975 | 981 | | |
976 | 982 | | |
977 | 983 | | |
978 | 984 | | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
979 | 988 | | |
980 | 989 | | |
981 | 990 | | |
982 | 991 | | |
983 | 992 | | |
984 | 993 | | |
985 | 994 | | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
986 | 998 | | |
987 | 999 | | |
988 | 1000 | | |
| |||
1004 | 1016 | | |
1005 | 1017 | | |
1006 | 1018 | | |
| 1019 | + | |
1007 | 1020 | | |
1008 | 1021 | | |
1009 | 1022 | | |
| |||
1015 | 1028 | | |
1016 | 1029 | | |
1017 | 1030 | | |
| 1031 | + | |
| 1032 | + | |
1018 | 1033 | | |
1019 | 1034 | | |
1020 | 1035 | | |
| |||
0 commit comments