Comments (13)
Original comment by Buck Evan (BitBucket: bukzor, GitHub: @bukzor?):
Profile of analysis of a similar class with just 14 methods, which takes 30 seconds.
from astroid.
Original comment by Buck Evan (BitBucket: bukzor, GitHub: @bukzor?):
The raw data which was used to generate the above image.
from astroid.
Original comment by Buck Evan (BitBucket: bukzor, GitHub: @bukzor?):
The raw data which was used to generate the above image.
from astroid.
Original comment by Buck Evan (BitBucket: bukzor, GitHub: @bukzor?):
As a minor update, my attempt to time the inference on the somewhat smaller class is still running, ten days later. The cputime is 9 days, 20:58:43.
I'm killing it now.
from astroid.
Original comment by Sylvain Thénault (BitBucket: sthenault, GitHub: @sthenault?):
there is much probably an infinite loop somewhere which doesn't end into an
infinite recursion error and so ends endlessly.
from astroid.
Original comment by Buck Evan (BitBucket: bukzor, GitHub: @bukzor?):
My hypothesis is different: I believe it's tracing all the possible assignment paths in a permutative manner, yielding O(n^n) performance. With smaller numbers (3-10), it does complete, just exponentially slower for each new method.
from astroid.
Original comment by BitBucket: eevee, GitHub: @eevee?:
I looked into this a bit in the course of trying to improve pylint performance on a large and terrible codebase. :)
Buck is correct; this is equivalent to O(n^n)
. The following happens:
- Encounter
trans = self.transaction
in method 1. Try to inferself.transaction
. - Encounter
self.transaction = trans
in method 1. Infertrans
. Findtrans = self.transaction
in method 1. Skip it because it's already being inferred. - Encounter
self.transaction = trans
in method 2. Infertrans
. Findtrans = self.transaction
in method 2. Try to inferself.transaction
. - Encounter
self.transaction = trans
in method 1...
This repeats rather ridiculously. Every assignment of self.transaction
tries to infer from every assignment to it. Method 1 tries to infer from methods 2 through n
, which each try to infer from methods 2 through n
except themselves, etc. So each of n
methods tries to infer from n
- 1 methods which try to infer from n
- 2 methods, and so on, producing O(n!)
. It only terminates at all because the inference of a particular expression is prevented from inferring itself; otherwise method 1 would try to infer itself forever.
I think I have a small fix for this, which involves extending the existing recursive-inference protection to avoid inferring the same attribute on an instance of the same class twice in the call stack. I'll post it as soon as I figure out how to do that with hg and bitbucket. :)
from astroid.
Original comment by Sylvain Thénault (BitBucket: sthenault, GitHub: @sthenault?):
sounds good eevee, thanks !
don't hesitate to ask for help for submitting your patch.
from astroid.
Original comment by Buck Evan (BitBucket: bukzor, GitHub: @bukzor?):
+1 +1
from astroid.
Original comment by Buck Evan (BitBucket: bukzor, GitHub: @bukzor?):
@eevee Put your diff on http://paste.pound-python.org/ if you're really stuck on bitbucket/hg.
This page always gives me enough information to do what I need with hg: http://mercurial.selenic.com/wiki/GitConcepts#Command_equivalence_table
from astroid.
Original comment by Sylvain Thénault (BitBucket: sthenault, GitHub: @sthenault?):
@eevee any update on this? Astroid should be released soon, it would be great if it could include a fix for this one.
from astroid.
Original comment by BitBucket: eevee, GitHub: @eevee?:
Finally submitted pull request #28, which includes a commit to fix this issue.
from astroid.
Original comment by Sylvain Thénault (BitBucket: sthenault, GitHub: @sthenault?):
Avoid recursively inferring the same attr on the same class. Closes #7
from astroid.
Related Issues (20)
- 2.15.7: sdist is still missing `tox.ini` HOT 3
- Regression in Astroid version 2.15.7 in handling subscriptable type parameters HOT 2
- `sphinx-autoapi` after astroid `v3.0.0` HOT 1
- A dataclass of type ``enum.Enum`` does not contain the enum ``__members__`` object HOT 4
- astroid depends on 'crypt', which is removed in Python 3.13 HOT 4
- Pyreverse does not show return type for property methods HOT 1
- Backstory behind license being LGPL? HOT 1
- Explore using `optimize` argument of `ast.parse()` in Python 3.13
- Test failures on Python 3.13 with astroid 3.0.2 HOT 4
- PEP 695: infer generic bases
- Editable installs don't expose `__version__`, break pylint HOT 4
- Exception 'RecursionError: maximum recursion depth exceeded' in astroid decorators with astroid 3.1.0 HOT 1
- test_pydantic_field failes HOT 2
- `test_no_user_warning` assumes pip is available HOT 1
- sphinx warnings `reference target not found` HOT 4
- TryStar.ExceptHandler incorrectly infers types of caught exceptions
- `six.moves` brain is not effective when `six.moves` was already imported in interpreter running astroid HOT 1
- astroid crashes with RecursionError in a pytest session if schemathesis is installed HOT 5
- Test failures against NumPy 2.0.0rc2 HOT 1
- false not-an-iterable for __truediv__ with @overload HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from astroid.