Last active
August 22, 2019 20:45
-
-
Save alanjds/2a1bab875b6a3fc7a85305c33554cf2f to your computer and use it in GitHub Desktop.
What CPython modules are Pure and what ones are C-based?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
_original_import = __import__ | |
def store_loader(name, module, storage): | |
try: | |
spec = module.__spec__ | |
loader = spec.loader if type(spec.loader) == type else spec.loader.__class__ | |
except Exception as err: | |
loader = type(err) | |
module = err | |
storage.setdefault(loader, {})[name] = module | |
return loader | |
def print_stats(storage): | |
for k, v in storage.items(): | |
print(f'Items: {len(v)} \t\tLoader: {k}') | |
by_loader = {} | |
def _import(name, *args, **kwargs): | |
print(f'Importing: {name}') | |
result = _original_import(name, *args, **kwargs) | |
print(f'Imported: {name} -> {result}') | |
loader = store_loader(name, result, by_loader) | |
return result | |
__builtins__.__import__ = _import | |
import importlib | |
from stdlib_list import stdlib_list | |
for modname in stdlib_list('3.7'): | |
try: | |
m = importlib.import_module(modname) | |
except ImportError: | |
pass | |
print('\n\nAfter importing\n\n') | |
print_stats(by_loader) | |
import sys | |
for name, module in sys.modules.items(): | |
store_loader(name, module, by_loader) | |
print('\n\nAfter inspecting\n\n') | |
print_stats(by_loader) | |
from pprint import pprint | |
print('\n\nModules by loader:\n\n') | |
pprint(by_loader) | |
pprint('\n\nSummary:\n\n') | |
for loader, modules in by_loader.items(): | |
print(f'\nLoader: {loader}\n') | |
for module in sorted(modules): | |
print(f'\t{module}') | |
print('\n\nModules by loader:\n\n') | |
print_stats(by_loader) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment