[Python-Dev] [numpy wishlist] Interpreter support for temporary elision in third-party classes
Julian Taylor
jtaylor.debian at googlemail.com
Fri Jun 6 19:21:40 CEST 2014
On 06.06.2014 04:26, Greg Ewing wrote:
> Nathaniel Smith wrote:
>
>> I'd be a little nervous about whether anyone has implemented, say, an
>> iadd with side effects such that you can tell whether a copy was made,
>> even if the object being copied is immediately destroyed.
>
> I can think of at least one plausible scenario where
> this could occur: the operand is a view object that
> wraps another object, and its __iadd__ method updates
> that other object.
>
> In fact, now that I think about it, exactly this
> kind of thing happens in numpy when you slice an
> array!
>
> So the opt-in indicator would need to be dynamic, on
> a per-object basis, rather than a type flag.
>
yes an opt-in indicator would need to receive both operand objects so it
would need to be a slot in the object or number type object.
Would the addition of a tp_can_elide slot to the object types be
acceptable for this rather specialized case?
tp_can_elide receives two objects and returns one of three values:
* can work inplace, operation is associative
* can work inplace but not associative
* cannot work inplace
Implementation could e.g. look about like this:
TARGET(BINARY_SUBTRACT) {
fl = left->obj_type->tp_can_elide
fr = right->obj_type->tp_can_elide
elide = 0
if (unlikely(fl)) {
elide = fl(left, right)
}
else if (unlikely(fr)) {
elide = fr(left, right)
}
if (unlikely(elide == YES) && left->refcnt == 1) {
PyNumber_InPlaceSubtract(left, right)
}
else if (unlikely(elide == SWAPPABLE) && right->refcnt == 1) {
PyNumber_InPlaceSubtract(right, left)
}
else {
PyNumber_Subtract(left, right)
}
}
More information about the Python-Dev
mailing list