| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
| |
subscriptions.
They were defined to accept a name argument, but the actual implementation doesn't. Add tests for this. Fixes #208.
Also in test_adapter.py modernize idioms from assertTrue(x in y) and assertTrue(x is y) to assertIn and assertIs.
|
| | |
|
| | |
|
| |\
| |
| | |
Make @implementer and classImplements not add redundant interfaces
|
| | |
| |
| |
| |
| |
| | |
Seen in plone.app.testing as a problem in Products.GenericSetup.
Added tests for that.
|
| | |
| |
| |
| | |
redundancy detection for the sake of plone.app.caching.
|
| | |
| |
| |
| | |
classImplementsOnly and @implementer_only can still be used to do that.
|
| |\ \
| | |
| | | |
The ImmutableDeclaration also has immutable _v_attrs.
|
| | |/
| |
| |
| | |
Fixes #204
|
| |\ \
| |/
|/| |
Minor cleanup of #202.
|
| |/
|
|
| |
See https://github.com/zopefoundation/zope.interface/pull/202#pullrequestreview-389126705
|
| |\
| |
| | |
Let interfaces override __adapt__
|
| | |
| |
| |
| | |
the precedence of __conform__ vs __adapt__.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Cooperate with InterfaceClass to ensure there is no performance penalty for this. Fixes #3
+-------------------------------------------------------------+----------------+------------------------------+------------------------------+
| Benchmark | bench_master38 | bench_issue3 | bench_issue3_opt |
+=============================================================+================+==============================+==============================+
| call interface (provides; deep) | 369 ns | 454 ns: 1.23x slower (+23%) | not significant |
+-------------------------------------------------------------+----------------+------------------------------+------------------------------+
| call interface (provides; wide) | 373 ns | 457 ns: 1.22x slower (+22%) | 365 ns: 1.02x faster (-2%) |
+-------------------------------------------------------------+----------------+------------------------------+------------------------------+
| call interface (no alternate, no conform, not provided) | 671 ns | 760 ns: 1.13x slower (+13%) | 636 ns: 1.06x faster (-5%) |
+-------------------------------------------------------------+----------------+------------------------------+------------------------------+
| call interface (alternate, no conform, not provided) | 395 ns | 494 ns: 1.25x slower (+25%) | not significant |
+-------------------------------------------------------------+----------------+------------------------------+------------------------------+
| call interface (no alternate, valid conform, not provided) | 250 ns | not significant | 227 ns: 1.10x faster (-9%) |
+-------------------------------------------------------------+----------------+------------------------------+------------------------------+
| call interface (alternate, invalid conform, not provided) | 348 ns | 424 ns: 1.22x slower (+22%) | not significant |
+-------------------------------------------------------------+----------------+------------------------------+------------------------------+
|
| | | |
|
| |/
|
|
| |
duplicates in the index.
|
| |\
| |
| | |
Remove the bare except: statements.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Comparing to current master, there is no substantial difference.
+-------------------------------------------------------------+----------------+------------------------------+
| Benchmark | bench_master38 | bench_issue200 |
+=============================================================+================+==============================+
| call interface (alternate, no conform, not provided) | 395 ns | 414 ns: 1.05x slower (+5%) |
+-------------------------------------------------------------+----------------+------------------------------+
| call interface (no alternate, valid conform, not provided) | 250 ns | 240 ns: 1.04x faster (-4%) |
+-------------------------------------------------------------+----------------+------------------------------+
| read __module__ | 45.3 ns | 43.4 ns: 1.04x faster (-4%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (no registrations) | 3.23 ms | 3.31 ms: 1.02x slower (+2%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (all trivial registrations) | 3.93 ms | 4.40 ms: 1.12x slower (+12%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (all trivial registrations, wide inheritance) | 43.3 us | 45.5 us: 1.05x slower (+5%) |
+-------------------------------------------------------------+----------------+------------------------------+
| query adapter (all trivial registrations, deep inheritance) | 43.2 us | 46.9 us: 1.09x slower (+9%) |
+-------------------------------------------------------------+----------------+------------------------------+
| sort mixed | 361 us | 354 us: 1.02x faster (-2%) |
+-------------------------------------------------------------+----------------+------------------------------+
| contains (populated dict: interfaces) | 61.3 ns | 59.7 ns: 1.03x faster (-3%) |
+-------------------------------------------------------------+----------------+------------------------------+
Not significant (13): call interface (provides; deep); call interface (provides; wide); call interface (no alternate, no conform, not provided); call interface (alternate, invalid conform, not provided); read __name__; read __doc__; read providedBy; sort interfaces; sort implementedBy; contains (empty dict); contains (populated list: interfaces); contains (populated dict: implementedBy); contains (populated list: implementedBy)
|
| | | |
|
| |/
|
|
|
|
|
|
| |
Only catch AttributeError instead of everything.
Fixes #200
Note that this does break a doctest in five.intid (it's expecting a TypeError but it now gets Acquisition's RuntimeError).
|
| | |
|
| | |
|
| |\
| |
| | |
Ensure that objects that implement no interfaces still have Interface in iro and sro
|
| |/
|
|
|
|
| |
their iro and sro.
Fixes #197.
|
| | |
|
| | |
|
| |\
| |
| | |
Make the RO for InterfaceClass consistent and fix handling of the STRICT_IRO
|
| |/
|
|
|
|
|
|
| |
env variable.
Fixes #192 and fixes #194.
Also fix the IRO for OrderedDict on CPython 2
|
| | |
|
| | |
|
| |\ |
|
| | | |
|
| | | |
|
| | |
| |
| |
| | |
Reviewers weren't sure how it could be raised.
|
| | | |
|
| | |
| |
| |
| |
| |
| | |
the required attributes.
And fix the C handling of this case.
|
| | |
| |
| |
| | |
Several places needed to, essentially, call super.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This offers the absolute best performance at what seems like reasonable complexity.
+-------------------------------------------------------------+----------------+-------------------------------+
| Benchmark | 38-master-full | 38-faster-meta |
+=============================================================+================+===============================+
| read __module__ | 41.8 ns | 40.9 ns: 1.02x faster (-2%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| read __name__ | 41.8 ns | 39.9 ns: 1.05x faster (-5%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| read providedBy | 56.9 ns | 58.4 ns: 1.03x slower (+3%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| query adapter (no registrations) | 3.85 ms | 2.95 ms: 1.31x faster (-24%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| query adapter (all trivial registrations) | 4.62 ms | 3.63 ms: 1.27x faster (-21%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| query adapter (all trivial registrations, wide inheritance) | 51.8 us | 42.2 us: 1.23x faster (-19%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| query adapter (all trivial registrations, deep inheritance) | 52.0 us | 41.7 us: 1.25x faster (-20%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| sort interfaces | 234 us | 29.9 us: 7.84x faster (-87%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| sort mixed | 569 us | 340 us: 1.67x faster (-40%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| contains (empty dict) | 135 ns | 55.2 ns: 2.44x faster (-59%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| contains (populated dict: interfaces) | 137 ns | 56.1 ns: 2.45x faster (-59%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| contains (populated list: interfaces) | 39.7 us | 2.96 us: 13.42x faster (-93%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| contains (populated dict: implementedBy) | 137 ns | 55.2 ns: 2.48x faster (-60%) |
+-------------------------------------------------------------+----------------+-------------------------------+
| contains (populated list: implementedBy) | 40.6 us | 24.1 us: 1.68x faster (-41%) |
+-------------------------------------------------------------+----------------+-------------------------------+
Not significant (2): read __doc__; sort implementedBy
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This makes the rest of the attribute access fast again, but slows down
__module__.
+-------------------------------------------+------------+-------------------------------+
| Benchmark | 38-master3 | 38-faster-descr |
+===========================================+============+===============================+
| read __module__ | 41.1 ns | 123 ns: 2.99x slower (+199%) |
+-------------------------------------------+------------+-------------------------------+
| read __name__ | 41.3 ns | 39.9 ns: 1.04x faster (-3%) |
+-------------------------------------------+------------+-------------------------------+
| read __doc__ | 41.8 ns | 42.4 ns: 1.01x slower (+1%) |
+-------------------------------------------+------------+-------------------------------+
| query adapter (no registrations) | 3.85 ms | 2.95 ms: 1.30x faster (-23%) |
+-------------------------------------------+------------+-------------------------------+
| query adapter (all trivial registrations) | 4.59 ms | 3.67 ms: 1.25x faster (-20%) |
+-------------------------------------------+------------+-------------------------------+
| contains (empty dict) | 136 ns | 54.8 ns: 2.48x faster (-60%) |
+-------------------------------------------+------------+-------------------------------+
| contains (populated dict) | 137 ns | 55.7 ns: 2.46x faster (-59%) |
+-------------------------------------------+------------+-------------------------------+
| contains (populated list) | 40.2 us | 2.86 us: 14.03x faster (-93%) |
+-------------------------------------------+------------+-------------------------------+
Not significant (1): read providedBy
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This is pretty, but it slows down all attribute access to interfaces.
By up to 25%. I'm not sure that's acceptable for things like
Interface.providedBy.
+-------------------------------------------+------------+-------------------------------+
| Benchmark | 38-master3 | 38-faster3 |
+===========================================+============+===============================+
| read __module__ | 41.1 ns | 44.3 ns: 1.08x slower (+8%) |
+-------------------------------------------+------------+-------------------------------+
| read __name__ | 41.3 ns | 51.6 ns: 1.25x slower (+25%) |
+-------------------------------------------+------------+-------------------------------+
| read __doc__ | 41.8 ns | 53.3 ns: 1.28x slower (+28%) |
+-------------------------------------------+------------+-------------------------------+
| read providedBy | 56.7 ns | 71.6 ns: 1.26x slower (+26%) |
+-------------------------------------------+------------+-------------------------------+
| query adapter (no registrations) | 3.85 ms | 2.95 ms: 1.31x faster (-23%) |
+-------------------------------------------+------------+-------------------------------+
| query adapter (all trivial registrations) | 4.59 ms | 3.65 ms: 1.26x faster (-20%) |
+-------------------------------------------+------------+-------------------------------+
| contains (empty dict) | 136 ns | 55.4 ns: 2.45x faster (-59%) |
+-------------------------------------------+------------+-------------------------------+
| contains (populated dict) | 137 ns | 55.0 ns: 2.49x faster (-60%) |
+-------------------------------------------+------------+-------------------------------+
| contains (populated list) | 40.2 us | 2.95 us: 13.62x faster (-93%) |
+-------------------------------------------+------------+-------------------------------+
|
| | | |
|
| | |
| |
| |
| | |
obvious.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Current results (this branch vs master, 354faccebd5b612a2ac8e081a7e5d2f7fb1089c1):
| Benchmark | 38-master | 38-faster |
|-------------------------------------------|-----------|-------------------------------|
| query adapter (no registrations) | 3.81 ms | 3.03 ms: 1.26x faster (-20%) |
| query adapter (all trivial registrations) | 4.65 ms | 3.90 ms: 1.19x faster (-16%) |
| contains (empty dict) | 163 ns | 76.1 ns: 2.14x faster (-53%) |
| contains (populated dict) | 162 ns | 76.9 ns: 2.11x faster (-53%) |
| contains (populated list) | 40.3 us | 3.09 us: 13.04x faster (-92%) |
Also need benchmarks using inheritance. The 'implied' data structures
are also hash/equality based.
|
| | | |
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
benchmarks
Included benchmark numbers:
Current master, Python 3.8:
.....................
contains (empty dict): Mean +- std dev: 198 ns +- 5 ns
.....................
contains (populated dict): Mean +- std dev: 197 ns +- 6 ns
.....................
contains (populated list): Mean +- std dev: 53.1 us +- 1.2 us
This code:
.....................
contains (empty dict): Mean +- std dev: 77.9 ns +- 2.3 ns
.....................
contains (populated dict): Mean +- std dev: 78.4 ns +- 3.1 ns
.....................
contains (populated list): Mean +- std dev: 3.69 us +- 0.08 us
So anywhere from 2.5 to 15x faster. Not sure how that will translate to
larger benchmarks, but I'm hopeful.
It turns out that messing with ``__module__`` is nasty, tricky
business, especially when you do it from C. Everytime you define a new
subclass, the descriptors that you set get overridden by the type
machinery (PyType_Ready). I'm using a data descriptor and a meta class
right now to avoid that but I'm not super happy with that and would
like to find a better way. (At least, maybe the data part of the
descriptor isn't necessary?) It may be needed to move more code into
C, I don't want a slowdown accessing ``__module__`` either; copying
around the standard PyGetSet or PyMember descriptors isn't enough
because they don't work on the class object (so
``classImplements(InterfaceClass, IInterface)`` fails).
|
| | |\
| | |
| | | |
Ensure Interface is the last item in the __sro__.
|
| | |/
|/|
| |
| |
| |
| |
| |
| | |
__sro__ for caching.
In my local 'load the world' test, this went from ~7800 full C3 merges to about ~1100.
Also take steps to avoid triggering false positive warnings about changed ROs when it's *just* Interface that moved.
|
| |/
|
|
|
|
| |
None of the elegant solutions mentioned in the issue worked out, so I had to brute force it.
Fixes #8
|
| |\
| |
| | |
Documentation clarifications.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
- docs/adapter.rst
Subscriptions are returned from least to most specific, not the other way around; the docs were incorrect.
Add additional examples, and use more verbose names in current examples, to clarify this. Fixes #136.
- interfaces.py
names() and namesAndDescriptions() just return a collection, not a sequence. Fixes #134.
|