Увы, я не думаю, что есть решение вашей проблемы.Во-первых, я не знаю переносимого API, которое будет возвращать вам количество записей в каталоге (без их перечисления в первую очередь).Во-вторых, я не думаю, что есть API, который бы возвращал вам запись каталога по номеру, а не по имени.
Таким образом, в целом, программе придется перечислять O (n) записей каталога, чтобы получить один случайный элемент.Тривиальный подход для определения количества записей и последующего выбора одного из них либо потребует достаточно ОЗУ для хранения полного списка (os.listdir()
), либо потребуется второй раз перечислять каталог, чтобы найти случайный (n) элемент - всего n+n/2
операций.в среднем.
Есть немного лучший подход - но только немного - см. Случайный выбор строк из файлов .Короче говоря, есть способ выбрать случайный элемент из списка / итератора с неизвестной длиной, одновременно читая по одному элементу, и убедиться, что любой элемент может быть выбран с равной вероятностью.Но это не поможет с os.listdir()
, потому что он уже возвращает list
в памяти, которая уже содержит все записи 1M + - так что вы также можете задать вопрос о len()
...