Skip to content

Instantly share code, notes, and snippets.

@alanjds
Last active August 22, 2019 20:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alanjds/2a1bab875b6a3fc7a85305c33554cf2f to your computer and use it in GitHub Desktop.
Save alanjds/2a1bab875b6a3fc7a85305c33554cf2f to your computer and use it in GitHub Desktop.
What CPython modules are Pure and what ones are C-based?
_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