Skip to content

Commit 835de84

Browse files
Improve performance of looks_like_numpy_member() (#2178)
Avoids 32% of the calls to isinstance() when linting astroid
1 parent 14eeb3f commit 835de84

File tree

4 files changed

+30
-25
lines changed

4 files changed

+30
-25
lines changed

astroid/brain/brain_numpy_core_function_base.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
import functools
88

9-
from astroid.brain.brain_numpy_utils import infer_numpy_member, looks_like_numpy_member
9+
from astroid.brain.brain_numpy_utils import (
10+
attribute_looks_like_numpy_member,
11+
infer_numpy_member,
12+
)
1013
from astroid.inference_tip import inference_tip
1114
from astroid.manager import AstroidManager
1215
from astroid.nodes.node_classes import Attribute
@@ -25,5 +28,5 @@
2528
AstroidManager().register_transform(
2629
Attribute,
2730
inference_tip(inference_function),
28-
functools.partial(looks_like_numpy_member, func_name),
31+
functools.partial(attribute_looks_like_numpy_member, func_name),
2932
)

astroid/brain/brain_numpy_core_multiarray.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66

77
import functools
88

9-
from astroid.brain.brain_numpy_utils import infer_numpy_member, looks_like_numpy_member
9+
from astroid.brain.brain_numpy_utils import (
10+
attribute_looks_like_numpy_member,
11+
infer_numpy_member,
12+
name_looks_like_numpy_member,
13+
)
1014
from astroid.brain.helpers import register_module_extender
1115
from astroid.builder import parse
1216
from astroid.inference_tip import inference_tip
@@ -91,10 +95,10 @@ def vdot(a, b):
9195
AstroidManager().register_transform(
9296
Attribute,
9397
inference_tip(inference_function),
94-
functools.partial(looks_like_numpy_member, method_name),
98+
functools.partial(attribute_looks_like_numpy_member, method_name),
9599
)
96100
AstroidManager().register_transform(
97101
Name,
98102
inference_tip(inference_function),
99-
functools.partial(looks_like_numpy_member, method_name),
103+
functools.partial(name_looks_like_numpy_member, method_name),
100104
)

astroid/brain/brain_numpy_core_numeric.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
import functools
88

9-
from astroid.brain.brain_numpy_utils import infer_numpy_member, looks_like_numpy_member
9+
from astroid.brain.brain_numpy_utils import (
10+
attribute_looks_like_numpy_member,
11+
infer_numpy_member,
12+
)
1013
from astroid.brain.helpers import register_module_extender
1114
from astroid.builder import parse
1215
from astroid.inference_tip import inference_tip
@@ -42,5 +45,5 @@ def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None): ret
4245
AstroidManager().register_transform(
4346
Attribute,
4447
inference_tip(inference_function),
45-
functools.partial(looks_like_numpy_member, method_name),
48+
functools.partial(attribute_looks_like_numpy_member, method_name),
4649
)

astroid/brain/brain_numpy_utils.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from astroid.builder import extract_node
1010
from astroid.context import InferenceContext
11-
from astroid.nodes.node_classes import Attribute, Import, Name, NodeNG
11+
from astroid.nodes.node_classes import Attribute, Import, Name
1212

1313
# Class subscript is available in numpy starting with version 1.20.0
1414
NUMPY_VERSION_TYPE_HINTS_SUPPORT = ("1", "20", "0")
@@ -61,26 +61,21 @@ def _is_a_numpy_module(node: Name) -> bool:
6161
)
6262

6363

64-
def looks_like_numpy_member(member_name: str, node: NodeNG) -> bool:
64+
def name_looks_like_numpy_member(member_name: str, node: Name) -> bool:
6565
"""
66-
Returns True if the node is a member of numpy whose
66+
Returns True if the Name is a member of numpy whose
6767
name is member_name.
68+
"""
69+
return node.name == member_name and node.root().name.startswith("numpy")
6870

69-
:param member_name: name of the member
70-
:param node: node to test
71-
:return: True if the node is a member of numpy
71+
72+
def attribute_looks_like_numpy_member(member_name: str, node: Attribute) -> bool:
7273
"""
73-
if (
74-
isinstance(node, Attribute)
75-
and node.attrname == member_name
74+
Returns True if the Attribute is a member of numpy whose
75+
name is member_name.
76+
"""
77+
return (
78+
node.attrname == member_name
7679
and isinstance(node.expr, Name)
7780
and _is_a_numpy_module(node.expr)
78-
):
79-
return True
80-
if (
81-
isinstance(node, Name)
82-
and node.name == member_name
83-
and node.root().name.startswith("numpy")
84-
):
85-
return True
86-
return False
81+
)

0 commit comments

Comments
 (0)