-
-
Notifications
You must be signed in to change notification settings - Fork 33.9k
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