Есть ли способ улучшить мой код, который генерирует текстовый файл с 10 ^ 8 строк с возвращением функции intertools.product? - PullRequest
0 голосов
/ 19 октября 2018

Я хочу создать текстовый файл, заполненный строками, которые являются результатом перестановки с повторением с 10 числами в 8 возможных позициях, и я использую функцию itertools.product, потому что она возвращает то, что я заслуживаю.Проблема в том, что сценарий занимает слишком много времени (и я полагаю), много ресурсов, в основном тактирование процессора.

У меня есть следующий код:

from itertools import product

F = open("dic.txt", "w")
for option in product([0,1,2,3,4,5,6,7,8,9], repeat=8):
    line = str()
    for number in option:
        line += str(number)
    line += "\n"
    F.write(line)
F.close()

Он отлично работает, если *Аргумент 1007 * - это всего лишь 5

Редактировать: option - это кортежи, поэтому я снова зацикливаюсь.

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Параметр максимальной скорости с использованием подробностей реализации CPython: Нажмите все работу на C, позвольте product повторно использовать свой результат tuple, сопоставив выходные данные, так что tuple преобразуется и высвобождается дозапрашивается следующий, и преобразуйте его в int s и raw bytes, чтобы избежать повторного преобразования из int в str и избежать всех накладных расходов кодирования:

from itertools import product

with open("dic.txt", "wb") as f:
    f.writelines(map(b'%b\n'.__mod__, map(bytes, product(range(b'0'[0], b'9'[0]+1), repeat=8)))

Некоторые из этихоптимизация может быть немного неправильной для вашего варианта использования (например, если вы работаете в Windows и хотите преобразования с окончанием строки, если ваша локаль не совместима с ASCII и т. д.), но все они относительно просты в обходе;это только один из простейших примеров для ASCII-совместимых локалей, где допустимы простые новые строки.

0 голосов
/ 19 октября 2018

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

from itertools import product

with open("dic.txt", "w") as f:
    for option in product([0,1,2,3,4,5,6,7,8,9], repeat=8):
        f.write("{}\n".format("".join(str(o) for o in option)))

Вы также можете заменить свой список вариантов на диапазон:

from itertools import product

with open("dic.txt", "w") as f:
    for option in product(range(10), repeat=8):
        f.write("{}\n".format("".join(str(o) for o in option)))
0 голосов
/ 19 октября 2018

Попробуйте

F = open("dic.txt", "w")
F.write('\n'.join([str(option) for option in product([0,1,2,3,4,5,6,7,8,9], repeat=8)]))
F.close()
0 голосов
/ 19 октября 2018

Вы можете перебрать большее количество строк перед выполнением записи.Просто продолжайте добавлять к той же строке, например.1000 раз, прежде чем делать F.write (строка).Таким образом, вы экономите время, чтобы продолжать запись в файл снова и снова.

...