Since the OP is asking about the fastest way, I thought using os.scandir
and returns as soon as we found the first file should be the fastest. os.scandir
returns an iterator. We should avoid creating a whole list just to check if it is empty.
The test directory contains about 100 thousands files:
from pathlib import Path
import os
path = 'jav/av'
len(os.listdir(path))
>>> 101204
Then start our test:
def check_empty_by_scandir(path):
with os.scandir(path) as it:
return not any(it)
def check_empty_by_listdir(path):
return not os.listdir(path)
def check_empty_by_pathlib(path):
return not any(Path(path).iterdir())
%timeit check_empty_by_scandir(path)
>>> 179 µs ± 878 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit check_empty_by_listdir(path)
>>> 28 ms ± 185 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit check_empty_by_pathlib(path)
>>> 27.6 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
As we can see, check_empty_by_listdir
and check_empty_by_pathlib
is about 155 times slower than check_empty_by_scandir
. The result from os.listdir() and Path.iterdir() is identical because Path.iterdir() uses os.listdir() in the background, creating a whole list in memory.
Additionally, as people point out, reading os.stat is not an option, which returns 4096 on empty directories in linux.