-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Redo edgedb basic types to inherit from builtin types #366
Conversation
weakref.ref() will stop working on edgedb.Tuple objects.
edgedb-python/edgedb/datatypes/array.c Line 47 in dfb8c8b
Will other types from stdlib such as arrays inherit from builtin? |
Yes, but array may just be a subclass of |
Has it always been immutable? I thought EdgeQL supported mutation to the shape and size of arrays. |
Oh this PR is the edgedb-python construct of arrays only in query results, it was and will be immutable. |
Why can't we use the builtin |
edgedb.NamedTuple will now create a heap type for the names. The heap type "DerivedNamedTuple" has a different __new__(). weakref.ref() will stop working on edgedb.NamedTuple objects.
edgedb/datatypes/namedtuple.c
Outdated
EDGE_NEW_WITH_FREELIST(EDGE_NAMED_TUPLE, EdgeNamedTupleObject, | ||
&EdgeNamedTuple_Type, nt, size); | ||
PyTupleObject *nt = NULL; | ||
EDGE_NEW_WITH_FREELIST(EDGE_NAMED_TUPLE, PyTupleObject, type, nt, size); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We cannot reuse the builtin freelist for tuple
because the ob_type
is not &PyTuple_Type
.
* bpo-35810: incref type in new for Python 3.7 * bpo-40217: don't traverse type for Python 3.9+ * Don't resize a type object - over-allocate with invisible members * Moved slots to EdgeNamedTuple_Type for performance * Use Py_TRASHCAN_BEGIN / END in Python 3.8+
UPDATE: we decided to use plain Python |
45c1ba4
to
b8aa067
Compare
They way it is done is hacking the __mro__ to insert the enum.Enum class, while duck-typing the enum.Enum class.
Does the builtin list object support the same optimisation as before? Does this improve querying perf? |
The main optimization is still here, which is using the C API |
I'd love to hear more about the benchmarks once they're available. This sounds like a great change if memory allocation doesn't prove to be too impactful for builtin inheritance. Great stuff @fantix ❤️ |
Co-authored-by: Yury Selivanov <[email protected]>
Co-authored-by: Yury Selivanov <[email protected]>
Now edgedb.Object instances will use default Python object.__hash__, which is calculated baased on memory address. ``==`` compares memory address too. ``<``, ``<=``, ``>``, ``>=`` are disabled.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! (Aside from one little nit, see the new comment)
@i0bs benchmark updated |
Changes ======= * Implement dataclass for EdgeObject (#359) (by @fantix in dfb8c8b for #359) * Redo edgedb basic types to inherit from builtin types (#366) (by @fantix in b11b991 for #366) * Officially drop 3.6 support (#373) (by @msullivan in 7b76bc7 for #373) * Support Python 3.11 (#375) (by @msullivan in 04b0da2 for #375) * Codegen with the describe_query() API (#363) (by @fantix in 361221d for #363) * Add codegen docs (#380) (by @colinhacks in 23dd42e for #380) * Use typing_extension.Literal in codegen for Python 3.7 (by @fantix in 6d0d6ab) * Add __all__ to edgedb/__init__.py (by @fmoor in d3ef6d9) Fixes ===== * Improve duration parsing (by @fmoor in 241c80d) * Tweak wording in query_single() error messages (#369) (by @msullivan in e24bb53 for #369) * Fix flake tests on python3.7 (#371) (by @msullivan in 583e1cb for #371) * Don't reject tuple arguments on the client side (#370) (by @msullivan in 09c950f for #370) * Correct edgedb.Client.close() timeout behavior (by @fantix in 33a912c) * Ping first if conn is idle for too long (#365) (by @fantix in 99cf78a for #365) Deprecations ============ * Deprecate object links and simplify link property access (#379) (by @fantix in 2c5dcc7 for #379)
Changes ======= * Implement dataclass for EdgeObject (#359) (by @fantix in dfb8c8b for #359) * Redo edgedb basic types to inherit from builtin types (#366) (by @fantix in b11b991 for #366) * Officially drop 3.6 support (#373) (by @msullivan in 7b76bc7 for #373) * Support Python 3.11 (#375) (by @msullivan in 04b0da2 for #375) * Codegen with the describe_query() API (#363) (by @fantix in 361221d for #363) * Add codegen docs (#380) (by @colinhacks in 23dd42e for #380) * Use typing_extension.Literal in codegen for Python 3.7 (by @fantix in 6d0d6ab) * Add __all__ to edgedb/__init__.py (by @fmoor in d3ef6d9) Fixes ===== * Improve duration parsing (by @fmoor in 241c80d) * Tweak wording in query_single() error messages (#369) (by @msullivan in e24bb53 for #369) * Fix flake tests on python3.7 (#371) (by @msullivan in 583e1cb for #371) * Don't reject tuple arguments on the client side (#370) (by @msullivan in 09c950f for #370) * Correct edgedb.Client.close() timeout behavior (by @fantix in 33a912c) * Ping first if conn is idle for too long (#365) (by @fantix in 99cf78a for #365) * Use @-prefixed keys in object codec for link properties (#384) (by @fantix in 68480f9 for #377) Deprecations ============ * Deprecate object links and simplify link property access (#379) (by @fantix in 2c5dcc7 for #379)
edgedb.Tuple
istuple
weakref.ref()
will stop working onedgedb.Tuple
objects.edgedb.NamedTuple
is a subclass oftuple
DerivedNamedTuple
(subclass ofedgedb.NamedTuple
)weakref.ref()
will stop working onedgedb.NamedTuple
objects.edgedb.Set
islist
edgedb.Array
islist
edgedb.EnumValue
is a subclass ofenum.Enum
dataclasses.asdict()
result.Benchmark:
2.3 GHz Intel 4 Core, Turbo Boost Off, concurrency=10, time=100s
datatypes branch (left):
0.24 (right):
Tested query: