##// END OF EJS Templates
typing: make `bundlerepository` subclass `localrepository` while type checking...
typing: make `bundlerepository` subclass `localrepository` while type checking Currently, `mercurial/bundlerepo.py` is excluded from pytype, mostly because it complains that various `ui` and `vfs` fields in `localrepository` are missing. (`bundlerepository` dynamically subclasses `localrepository` when it is instantiated, so it works at runtime.) This makes that class hierarchy known to pytype. Having a protocol for `Repository` is probably the right thing to do, but that will be a lot of work and this still reflects the class at runtime. Subclassing also has the benefit of making sure any method overrides have a matching signature, so maybe this is a situation where we do both of these things. (I'm not sure how clear the diagnostics are if a class *almost* implements a protocol, but is missing a method argument or similar.) The subclassing is not done outside of type checking runs to avoid any side effects on already complex code.

File last commit:

r52756:f4733654 default
r52763:9d4ad05b default
Show More
memorytop.py
46 lines | 1.4 KiB | text/x-python | PythonLexer
# memorytop requires Python 3.4
#
# Usage: set PYTHONTRACEMALLOC=n in the environment of the hg invocation,
# where n>= is the number of frames to show in the backtrace. Put calls to
# memorytop in strategic places to show the current memory use by allocation
# site.
from __future__ import annotations
import gc
import tracemalloc
def memorytop(limit=10):
gc.collect()
snapshot = tracemalloc.take_snapshot()
snapshot = snapshot.filter_traces(
(
tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
tracemalloc.Filter(False, "<frozen importlib._bootstrap_external>"),
tracemalloc.Filter(False, "<unknown>"),
)
)
stats = snapshot.statistics('traceback')
total = sum(stat.size for stat in stats)
print("\nTotal allocated size: %.1f KiB\n" % (total / 1024))
print("Lines with the biggest net allocations")
for index, stat in enumerate(stats[:limit], 1):
print(
"#%d: %d objects using %.1f KiB"
% (index, stat.count, stat.size / 1024)
)
for line in stat.traceback.format(most_recent_first=True):
print(' ', line)
other = stats[limit:]
if other:
size = sum(stat.size for stat in other)
count = sum(stat.count for stat in other)
print(
"%s other: %d objects using %.1f KiB"
% (len(other), count, size / 1024)
)
print()