|
42 | 42 | import cProfile as profile
|
43 | 43 | import ctypes
|
44 | 44 | import importlib.machinery
|
| 45 | +import importlib.util |
45 | 46 | import inspect
|
46 | 47 | import itertools
|
47 | 48 | import json
|
|
58 | 59 | import traceback
|
59 | 60 | import contextlib
|
60 | 61 | import math
|
| 62 | +from pathlib import Path |
61 | 63 | from hashlib import sha256
|
62 | 64 | from importlib import import_module
|
63 | 65 | from collections import Counter
|
64 | 66 | from time import process_time
|
65 | 67 |
|
66 | 68 | wall_timer = timeit.default_timer
|
67 | 69 |
|
| 70 | +ON_PYPY = hasattr(sys, 'pypy_version_info') |
68 | 71 |
|
69 | 72 | if sys.platform.startswith('win'):
|
70 | 73 | import ctypes.wintypes
|
@@ -704,16 +707,64 @@ def __init__(self, name, func, attr_sources):
|
704 | 707 | self.unit = "bytes"
|
705 | 708 |
|
706 | 709 | def run(self, *param):
|
707 |
| - # We can't import asizeof directly, because we haven't loaded |
708 |
| - # the asv package in the benchmarking process. |
709 |
| - path = os.path.join( |
710 |
| - os.path.dirname(__file__), 'extern', 'asizeof.py') |
711 |
| - asizeof = importlib.machinery.SourceFileLoader('asizeof', path).load_module() |
| 710 | + if ON_PYPY: |
| 711 | + raise NotImplementedError("asizeof doesn't work on pypy") |
| 712 | + return |
| 713 | + |
| 714 | + def import_asizeof(): |
| 715 | + """Import asizeof, searching system Pythons in PATH.""" |
| 716 | + path_dirs = os.environ.get("PATH", "").split(os.pathsep) |
| 717 | + |
| 718 | + # On Windows, append the directories containing the Python executables |
| 719 | + if os.name == "nt": |
| 720 | + path_dirs += [sys.base_exec_prefix, sys.base_exec_prefix + "/Scripts"] |
| 721 | + |
| 722 | + asizeof_paths = set() |
| 723 | + for path in path_dirs: |
| 724 | + python_path = os.path.join(path, "python") |
| 725 | + if os.path.isfile(python_path) and os.access(python_path, os.X_OK): |
| 726 | + cand_path = Path(python_path).parent.parent / "lib" |
| 727 | + if cand_path not in asizeof_paths: |
| 728 | + asizeof_paths.add(cand_path) |
| 729 | + for asizeof_path in cand_path.rglob("asizeof.py"): |
| 730 | + try: # Still returns the first importable asizeof |
| 731 | + loader = importlib.machinery.SourceFileLoader( |
| 732 | + "asizeof", str(asizeof_path) |
| 733 | + ) |
| 734 | + return loader.load_module() |
| 735 | + except ImportError: |
| 736 | + pass |
| 737 | + |
| 738 | + # Try conda, mamba explicitly, needed on Windows |
| 739 | + try: |
| 740 | + env_path = os.environ["CONDA_PREFIX"] |
| 741 | + except KeyError: |
| 742 | + pass |
| 743 | + else: |
| 744 | + cand_path = Path(env_path) / "lib" |
| 745 | + if cand_path not in asizeof_paths: |
| 746 | + asizeof_paths.add(cand_path) |
| 747 | + for asizeof_path in cand_path.rglob("asizeof.py"): |
| 748 | + try: # Still returns the first importable asizeof |
| 749 | + loader = importlib.machinery.SourceFileLoader( |
| 750 | + "asizeof", str(asizeof_path) |
| 751 | + ) |
| 752 | + return loader.load_module() |
| 753 | + except ImportError: |
| 754 | + pass |
| 755 | + |
| 756 | + return NotImplementedError("asizeof not found anywhere") |
| 757 | + |
| 758 | + try: |
| 759 | + from pympler.asizeof import asizeof |
| 760 | + except ImportError: |
| 761 | + asizeof = import_asizeof() |
| 762 | + from asizeof import asizeof |
712 | 763 |
|
713 | 764 | obj = self.func(*param)
|
714 | 765 |
|
715 |
| - sizeof2 = asizeof.asizeof([obj, obj]) |
716 |
| - sizeofcopy = asizeof.asizeof([obj, copy.copy(obj)]) |
| 766 | + sizeof2 = asizeof([obj, obj]) |
| 767 | + sizeofcopy = asizeof([obj, copy.copy(obj)]) |
717 | 768 |
|
718 | 769 | return sizeofcopy - sizeof2
|
719 | 770 |
|
|
0 commit comments