Давайте начнем с самого простого - почему вы строите datetime
только для того, чтобы переформатировать его как строку, а затем выполнить сравнение строк?
Тогда естьВесь смысл использования os.scandir()
сверх os.listdir()
- os.scandir()
возвращает os.DirEntry
, который кэширует статистику файла черезos.DirEntry.stat()
call.
В зависимости от проверок, которые вам необходимо выполнить, os.listdir()
может работать даже лучше, если вы ожидаете много фильтрации наимя файла, то вам не нужно будет создавать целое os.DirEntry
просто для его удаления.
Итак, чтобы оптимизировать цикл, если вы не ожидаете много фильтрациина имя:
for entry in os.scandir(Path):
if entry.is_file() and 1528495200 <= entry.stat().st_ctime < 1528581600:
pass # do whatever you need with it
Если вы это сделаете, то лучше придерживаться os.listdir()
как:
import stat
for entry in os.listdir(Path):
# do your filtering on the entry name first...
path = os.path.join(Path, entry) # build path to the listed entry...
stats = os.stat(path) # cache the file entry statistics
if stat.S_ISREG(stats.st_mode) and 1528495200 <= stats.st_ctime < 1528581600:
pass # do whatever you need with it
Если вы хотите быть гибкими с отметками времени, используйте datetime.datetime.timestamp()
заранее, чтобы получить метки времени POSIX, а затем вы можете сравнить их с тем, что stat_result.st_ctime
возвращает напрямую без преобразования.
Однако,даже ваш оригинальный, неоптимизированный подход должен быть значительно быстрее, чем 2 часа всего за 10 000 записей.Я бы тоже проверил базовую файловую систему, там что-то не так.