Right now it is implemented as:
|
/*[clinic input] |
|
os.DirEntry.is_junction -> bool |
|
defining_class: defining_class |
|
/ |
|
|
|
Return True if the entry is a junction; cached per entry. |
|
[clinic start generated code]*/ |
|
|
|
static int |
|
os_DirEntry_is_junction_impl(DirEntry *self, PyTypeObject *defining_class) |
|
/*[clinic end generated code: output=7061a07b0ef2cd1f input=475cd36fb7d4723f]*/ |
|
{ |
|
#ifdef MS_WINDOWS |
|
return self->win32_lstat.st_reparse_tag == IO_REPARSE_TAG_MOUNT_POINT; |
|
#else |
|
return 0; |
|
#endif |
|
} |
Removing unused defining_class: defining_class from clinic has one big adavantage (aside from the fact that it is unused in the first place): it speeds up is_junction call.
The exact benchmark is system-dependent, here are my numbers (note, that I am on macos and always get False as the result).
Setup:
./configure --with-pydebug && make -j
- Install
pyperf
pyperf timeit --setup 'import os; d = os.scandir("."); d1 = next(d); d.close()' 'd1.is_junction()'
With defining_class:
(.venv) ~/Desktop/cpython main ✔ 1 ⚠️
» pyperf timeit --setup 'import os; d = os.scandir("."); d1 = next(d); d.close()' 'd1.is_junction()'
.....................
Mean +- std dev: 46.1 ns +- 0.5 ns
Without:
(.venv) ~/Desktop/cpython main ✗
» pyperf timeit --setup 'import os; d = os.scandir("."); d1 = next(d); d.close()' 'd1.is_junction()'
.....................
Mean +- std dev: 25.0 ns +- 0.3 ns
This happens because is_junction def is changed from METH_METHOD|METH_FASTCALL|METH_KEYWORDS to METH_NOARGS.
I have a PR ready.
Linked PRs
Right now it is implemented as:
cpython/Modules/posixmodule.c
Lines 14566 to 14583 in 79823c1
Removing unused
defining_class: defining_classfrom clinic has one big adavantage (aside from the fact that it is unused in the first place): it speeds upis_junctioncall.The exact benchmark is system-dependent, here are my numbers (note, that I am on macos and always get
Falseas the result).Setup:
./configure --with-pydebug && make -jpyperfpyperf timeit --setup 'import os; d = os.scandir("."); d1 = next(d); d.close()' 'd1.is_junction()'With
defining_class:Without:
This happens because
is_junctiondef is changed fromMETH_METHOD|METH_FASTCALL|METH_KEYWORDStoMETH_NOARGS.I have a PR ready.
Linked PRs
os.DirEntry.is_junctionfunction #108718