Более быстрый способ хождения по Директории вместо os.listdir?

Если вам нужно присоединиться и фильтровать что-то, что можно сделать за пределами соединения. Фильтр можно сделать после создания коллекции.

В этом случае, если я это сделаю в условии соединения, я уменьшу возвращаемые строки.

Используется тернарное условие (= n == null ? "__" : n.MonDayNote,)

  • Если объект null (поэтому нет совпадений), верните то, что после ?. __, в этом случае.
  • Else, верните то, что после :, n.MonDayNote.

Спасибо другим участникам, где я начал с моей собственной проблемы.


        var schedLocations = (from f in db.RAMS_REVENUE_LOCATIONS
              join n in db.RAMS_LOCATION_PLANNED_MANNING on f.revenueCenterID equals

                  n.revenueCenterID into lm

              from n in lm.DefaultIfEmpty()

              join r in db.RAMS_LOCATION_SCHED_NOTE on f.revenueCenterID equals r.revenueCenterID
              into locnotes

              from r in locnotes.DefaultIfEmpty()
              where f.LocID == nLocID && f.In_Use == true && f.revenueCenterID > 1000

              orderby f.Areano ascending, f.Locname ascending
              select new
              {
                  Facname = f.Locname,
                  f.Areano,
                  f.revenueCenterID,
                  f.Locabbrev,

                  //  MonNote = n == null ? "__" : n.MonDayNote,
                  MonNote = n == null ? "__" : n.MonDayNote,
                  TueNote = n == null ? "__" : n.TueDayNote,
                  WedNote = n == null ? "__" : n.WedDayNote,
                  ThuNote = n == null ? "__" : n.ThuDayNote,

                  FriNote = n == null ? "__" : n.FriDayNote,
                  SatNote = n == null ? "__" : n.SatDayNote,
                  SunNote = n == null ? "__" : n.SunDayNote,
                  MonEmpNbr = n == null ? 0 : n.MonEmpNbr,
                  TueEmpNbr = n == null ? 0 : n.TueEmpNbr,
                  WedEmpNbr = n == null ? 0 : n.WedEmpNbr,
                  ThuEmpNbr = n == null ? 0 : n.ThuEmpNbr,
                  FriEmpNbr = n == null ? 0 : n.FriEmpNbr,
                  SatEmpNbr = n == null ? 0 : n.SatEmpNbr,
                  SunEmpNbr = n == null ? 0 : n.SunEmpNbr,
                  SchedMondayDate = n == null ? dMon : n.MondaySchedDate,
                  LocNotes = r == null ? "Notes: N/A" : r.LocationNote

              }).ToList();
                Func<int, string> LambdaManning = (x) => { return x == 0 ? "" : "Manning:" + x.ToString(); };
        DataTable dt_ScheduleMaster = PsuedoSchedule.Tables["ScheduleMasterWithNotes"];
        var schedLocations2 = schedLocations.Where(x => x.SchedMondayDate == dMon);
16
задан Phyo Arkar Lwin 1 July 2010 в 23:30
поделиться

3 ответа

Вы должны измерять непосредственно на машинах (ОС, файловых системах и их кэшах и т. Д.), Которые вас интересуют - независимо от того, работает ли os.walk быстрее, чем ] os.listdir на конкретной и совершенно другой машине / OS / FS мало что скажет о производительности на вашей .

Не понимаю, что вы имеете в виду под cachedir.listdir - нет стандартного библиотечного модуля / функции с таким именем. listdir уже считывает весь каталог одним глотком (поскольку он должен отсортировать результаты), как и os.walk (поскольку он должен отделять подкаталоги от файлов). Если, в зависимости от вашей платформы, у вас есть быстрый способ получать уведомления об изменениях файлов / каталогов, то, вероятно, стоит построить дерево один раз и редактировать его постепенно по мере поступления уведомлений об изменениях ... но это зависит от относительной частоты изменений vs, что, опять же, полностью зависит от конкретных условий приложения .

5
ответ дан 30 November 2019 в 16:18
поделиться

По порядку:

  • Я сомневаюсь, что вы заметите значительное ускорение между os.walk и os.listdir , поскольку оба полагаются на лежащую в основе файловую систему. Фактически, я подозреваю, что основная файловая система будет иметь большое влияние на скорость операции.

  • Любая операция с кешем будет значительно быстрее, чем обращение к файловой системе (по крайней мере, для второй и последующих проверок).

  • Вы всегда можете написать какую-нибудь утилиту (или вызвать команду оболочки), которая генерирует список каталогов вне Python и вызывает его через модуль subprocess . Но это немного сложно, и я бы обратился к этому решению только в том случае, если выяснилось, что кеш у вас не работает.

  • Если вы не нашли файловый браузер в Cheeseshop , вы, вероятно, его не найдете.

3
ответ дан 30 November 2019 в 16:18
поделиться

os.path.walk может увеличить вашу производительность по двум причинам:

1) Если вы можете остановить хождение до того, как пройдете все, то это действительно будет быстрее, чем listdir, хотя это заметно только при работе с большими деревьями

2) Если вы перечисляете ОГРОМНЫЕ каталоги, то создание списка, возвращаемого listdir, может быть дорогостоящим. (Неправда, см. комментарий Алекса ниже)

Однако, скорее всего, это не будет иметь значения и может быть даже медленнее, из-за потенциально дополнительных накладных расходов, связанных с вызовом вашей функции visit и выполнением всех дополнительных операций по упаковке и распаковке аргументов.

(Действительно, единственный способ ответить на этот вопрос - проверить это самостоятельно - это займет всего несколько минут)

0
ответ дан 30 November 2019 в 16:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: