Uh oh!
There was an error while loading. Please reload this page.
bpo-33521: Add 1.32x faster C implementation of asyncio.isfuture(). - #6876
bpo-33521: Add 1.32x faster C implementation of asyncio.isfuture().#6876jimmylai wants to merge 2 commits into
Conversation
There was a problem hiding this comment.
Please use 4 spaces to ident your code (as the rest of _asynciomodule.c file).
There was a problem hiding this comment.
Move ); to the previous line, so that
intclass_has_attr=_PyObject_HasAttrId(
class, &PyId__asyncio_future_blocking);There was a problem hiding this comment.
While this code is OK, you shouldn't use refs to Python objects after you DECREF them, it's a bad style. Please compare first, and decref after,
bedevere-bot
commented
May 17, 2018
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
c72d089 to
58ad925Comparejimmylai
commented
May 19, 2018
I have made the requested changes; please review again. |
bedevere-bot
commented
May 19, 2018
Thanks for making the requested changes! @1st1: please review the changes made to this pull request. |
There was a problem hiding this comment.
Why not use Future_CheckExact() / Future_Check() as very fast happy path here?
There was a problem hiding this comment.
@asvetlov@1st1 isfuture check if _asyncio_future_blocking exists and is not None because mock object has _asyncio_future_blocking as None and we want to return isfuture() as False in this case.
See test case
cpython/Lib/test/test_asyncio/test_futures.py
Lines 123 to 124 in 8425de4
Do we really want to use Future_CheckExact to return fast?
bedevere-bot
commented
May 19, 2018
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
serhiy-storchaka
left a comment
There was a problem hiding this comment.
I don't know whether it is worth to add C implementation of this function, but I think it can be simplified.
See also that the _asyncio_future_blocking attribute is used in the existing C code in suboptimal way.
There was a problem hiding this comment.
It is better to use Py_TYPE() for convenience and speed . There is a subtle difference between the type and the __class__ attribute, but it is usually ignored when write C accelerations.
There was a problem hiding this comment.
I suggested to @jimmylai to get the class attribute to make sure that the C implementation behaves as the Python implementation: see PEP 399. If someone wants to use type(), I would prefer to see the same change in the Python implementation as well.
@1st1, @asvetlov: Do you know the rationale for checking class here?
There was a problem hiding this comment.
I suggested to use Py_TYPE as well.
I think it was I who used __class__ there, and there's no rationale behind that :)
There was a problem hiding this comment.
So the Python version can be updated to use type() too.
There was a problem hiding this comment.
@1st1@serhiy-storchaka
use type() won't work.
Original isfuture: return (hasattr(obj.__class__, '_asyncio_future_blocking') and obj._asyncio_future_blocking is not None)
Use type: return (hasattr(type(obj), '_asyncio_future_blocking') and obj._asyncio_future_blocking is not None)
Unit tests fail when use type()
Did I use type() wrong?
======================================================================
FAIL: test_isfuture (test.test_asyncio.test_futures.CFutureTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jimmylai/workspace/cpython/Lib/test/test_asyncio/test_futures.py", line 131, in test_isfuture
self.assertTrue(asyncio.isfuture(mock.Mock(type(f))))
AssertionError: False is not true
======================================================================
FAIL: test_isfuture (test.test_asyncio.test_futures.CSubFutureTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jimmylai/workspace/cpython/Lib/test/test_asyncio/test_futures.py", line 131, in test_isfuture
self.assertTrue(asyncio.isfuture(mock.Mock(type(f))))
AssertionError: False is not true
======================================================================
FAIL: test_isfuture (test.test_asyncio.test_futures.PyFutureTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jimmylai/workspace/cpython/Lib/test/test_asyncio/test_futures.py", line 131, in test_isfuture
self.assertTrue(asyncio.isfuture(mock.Mock(type(f))))
AssertionError: False is not true
There was a problem hiding this comment.
Make the argument positional-only.
There was a problem hiding this comment.
In pratice, it means adding "/" on a new line, aligned with "obj", and run "make clinic" again.
There was a problem hiding this comment.
class may not have attr _asyncio_future_blocking
It's needed.
55c77d7 to
66e4586Comparejimmylai
commented
Jun 18, 2018
I have made the requested changes; please review again. |
bedevere-bot
commented
Jun 18, 2018
asvetlov
commented
Aug 2, 2018
@jimmylai the PR is failing on tests passing. |
csabella
commented
Jan 25, 2020
@jimmylai, please take a look at the last comment and please also resolve the merge conflict. Thank you! |
kumaraditya303
commented
Apr 19, 2022
This PR is awaiting changes for over two years, tests were failing and has merge conflicts so I am closing it. If you are still interested you can create a new PR with the requested changes or this one can be reopened if needed. |
https://bugs.python.org/issue33521