| 42 | @sizeof.register(set) |
| 43 | @sizeof.register(frozenset) |
| 44 | def sizeof_python_collection(seq): |
| 45 | num_items = len(seq) |
| 46 | num_samples = 10 |
| 47 | if num_items > num_samples: |
| 48 | if isinstance(seq, (set, frozenset)): |
| 49 | # As of Python v3.9, it is deprecated to call random.sample() on |
| 50 | # sets but since sets are unordered anyways we can simply pick |
| 51 | # the first `num_samples` items. |
| 52 | samples = itertools.islice(seq, num_samples) |
| 53 | else: |
| 54 | samples = random.sample(seq, num_samples) |
| 55 | return sys.getsizeof(seq) + int( |
| 56 | num_items / num_samples * sum(map(sizeof, samples)) |
| 57 | ) |
| 58 | else: |
| 59 | return sys.getsizeof(seq) + sum(map(sizeof, seq)) |
| 60 | |
| 61 | |
| 62 | class SimpleSizeof: |