Thanks to visit codestin.com
Credit goes to github.com

Skip to content

os.DirEntry.is_junction can be ~twice as fast #108717

Closed
@sobolevn

Description

@sobolevn

Right now it is implemented as:

cpython/Modules/posixmodule.c

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 dirperformancePerformance or resource usage

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions