-
-
Notifications
You must be signed in to change notification settings - Fork 32.7k
Closed
Labels
extension-modulesC modules in the Modules dirC modules in the Modules dirperformancePerformance or resource usagePerformance or resource usage
Description
Right now it is implemented as:
Lines 14566 to 14583 in 79823c1
/*[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
Metadata
Metadata
Assignees
Labels
extension-modulesC modules in the Modules dirC modules in the Modules dirperformancePerformance or resource usagePerformance or resource usage