From 003ba5447f8c95cdf20b53300bad4e7756702ba1 Mon Sep 17 00:00:00 2001 From: Karenzz Date: Wed, 19 Apr 2023 01:00:21 +0200 Subject: [PATCH] Update page 'Day9 homework - Karen' --- Day9 homework - Karen.md | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/Day9 homework - Karen.md b/Day9 homework - Karen.md index 73d48c9..d9dfa46 100644 --- a/Day9 homework - Karen.md +++ b/Day9 homework - Karen.md @@ -163,6 +163,55 @@ if __name__ == '__main__' and __package__ is None: **10. Add a feature to the script which looks at `file` for each module, trims the filename to get the directory name, then prints out a histogram of how many modules are in each directory name. If you can't find a text histogram output library in anaconda's built-in modules, just print out the `*` character for each module.** ``` +import os +import sys +import importlib.util +import types +from collections import defaultdict + + +def get_bytecode_size(module_name): + """Get the size of the cached .pyc bytecode file for a module.""" + spec = importlib.util.find_spec(module_name) + if spec and spec.origin.endswith('.py'): + pyc_file = importlib.util.cache_from_source(spec.origin) + if os.path.exists(pyc_file): + return os.path.getsize(pyc_file) + return 0 + + +def get_dso_size(module_name): + """Get the size of the DSO (Dynamic Shared Object) module file for a module.""" + spec = importlib.util.find_spec(module_name) + if spec and spec.origin.endswith(('.so', '.dll')): + return os.path.getsize(spec.origin) + return 0 + + +def generate_module_report(): + """Generate a report summarizing the module environment.""" + total_modules = len(sys.modules) + bytecode_size = sum(get_bytecode_size(module_name) for module_name in sys.modules) + dso_size = sum(get_dso_size(module_name) for module_name in sys.modules) + python_size = sum( + sys.modules[module_name].__sizeof__() + for module_name in sys.modules + if isinstance(sys.modules[module_name], types.ModuleType) + ) + total_size = bytecode_size + dso_size + python_size + + # Calculate percentage of each type of module + bytecode_percent = bytecode_size / total_size * 100 + dso_percent = dso_size / total_size * 100 + python_percent = python_size / total_size * 100 + + # Generate the report + report = f"Total modules: {total_modules}\n" + report += f"Total size: {total_size} bytes\n" + report += f"Bytecode modules: {bytecode_percent:.2f}% ({bytecode_size} bytes)\n" + report += f"DSO modules: {dso_percent:.2f}% ({dso_size} bytes)\n" + report += f"Python code modules: {python_percent:.2f}% ({python_size} bytes)\n" + # Generate histogram of module directory names dir_histogram = defaultdict(int) for module_name in sys.modules: @@ -174,4 +223,11 @@ if __name__ == '__main__' and __package__ is None: report += "\nModule Directory Histogram:\n" for module_dir, count in dir_histogram.items(): report += f"{module_dir}: {'*' * count}\n" + + return report + + +if __name__ == "__main__": + report = generate_module_report() + print(report) ``` \ No newline at end of file