FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

`os.DirEntry.is_junction` can be ~twice as fast · Issue #108717 · python/cpython · GitHub

Repository navigation

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

Closed

Description

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

Activity

  1. self-assigned this
    on Aug 31, 2023
  2. added a commit that references this issue on Aug 31, 2023
  3. added a commit that references this issue on Sep 6, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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


    Back | FazBrowse Home | New Git URL