Эффективность петли в Python

Я ищу способ выполнить мой цикл быстрее. В текущем коде вычисления выполняются навсегда. Поэтому я ищу способ сделать мой код более эффективным.

EDIT: я не думаю, что объясню, мне нужно создать программу, которая делает все возможные комбинации из 8 цифр, не забывая включать в себя верхний, нижний регистр и цифры. Затем зашифруйте md5 эти возможные комбинации и сохраните их в файл. Но у меня есть новые вопросы, этот процесс займет 63 года, чтобы взвесить этот файл? В конце сценария? Последняя покупка vps-сервера для этой задачи, но если потребуется 63 года, лучше даже не попробовать ха-ха ..

Я новичок в кодировании, и вся помощь приветствуется

import hashlib from random import choice longitud = 8 valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" def enc(string): m = hashlib.md5() m.update(string.encode('utf-8')) return m.hexdigest() def code(): p = "" p = p.join([choice(valores) for i in xrange(longitud)]) text = p return text i = 1 for i in xrange(2000000000000000000): cod = code() md = enc(cod) print cod print md i += 1 print i f=open('datos.txt','a') f.write("%s " % cod) f.write("%s" % md) f.write('\n') f.close() 

4 Solutions collect form web for “Эффективность петли в Python”

Вы не используете полную мощность современных компьютеров, у которых есть несколько центральных процессоров! Это, безусловно, лучшая оптимизация, которую вы можете иметь здесь, так как это связано с процессором . Примечание: для операций привязки ввода-вывода многопоточность (с использованием модуля потоковой передачи) подходит.

Итак, давайте посмотрим, как python упрощает это использование с использованием модуля многопроцессорности (чтение комментариев):

 import hashlib # you're sampling a string so you need sample, not 'choice' from random import sample import multiprocessing # use a thread to synchronize writing to file import threading # open up to 4 processes per cpu processes_per_cpu = 4 processes = processes_per_cpu * multiprocessing.cpu_count() print "will use %d processes" % processes longitud = 8 valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" # check on smaller ranges to compare before trying your range... :-) RANGE = 200000 def enc(string): m = hashlib.md5() m.update(string.encode('utf-8')) return m.hexdigest() # we synchronize the results to be written using a queue shared by processes q = multiprocessing.Manager().Queue() # this is the single point where results are written to the file # the file is opened ONCE (you open it on every iteration, that's bad) def write_results(): with open('datos.txt', 'w') as f: while True: msg = q.get() if msg == 'close': break; else: f.write(msg) # this is the function each process uses to calculate a single result def calc_one(i): s = ''.join(sample(valores, longitud)) md = enc(s) q.put("%s %s\n" % (s, md)) # we start a process pool of workers to spread work and not rely on # a single cpu pool = multiprocessing.Pool(processes=processes) # this is the thread that will write the results coming from # other processes using the queue, so it's execution target is write_results t = threading.Thread(target=write_results) t.start() # we use 'map_async' to not block ourselves, this is redundant here, # but it's best practice to use this when you don't HAVE to block ('pool.map') pool.map_async(calc_one, xrange(RANGE)) # wait for completion pool.close() pool.join() # tell result-writing thread to stop q.put('close') t.join() 

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

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

примечание 2 : Поскольку OP стремилась перебирать комбинации / перестановки в материалах, следует отметить, что есть модуль для этого, и он называется itertools .

Обратите внимание, что вы должны использовать

 for cod in itertools.product(valores, longitud): 

вместо того, чтобы выбирать строки через random.sample как это только когда-нибудь посещает данную строку один раз.

Также обратите внимание, что для ваших заданных значений этот цикл имеет итерации 218340105584896. И выходной файл будет занимать 9170284434565632 байт или 8PB.

Сначала cProfile свою программу (с модулем cProfile : https://docs.python.org/2/library/profile.html и http://ymichael.com/2014/03/08/profiling-python-with-cprofile. html ), но я готов поспорить, что ваша программа привязана к IO (если ваше использование процессора никогда не достигает 100% на одном ядре, это означает, что ваш жесткий диск слишком медленный, чтобы не отставать от скорости выполнения остальной части программы ).

Помня об этом, начните с изменения вашей программы, чтобы:

  • Он открывает и закрывает файл за пределами цикла (открытие и закрытие файлов происходит очень медленно).
  • Это делает только один вызов write на каждой итерации (каждый из них переводится в syscall, что дорого), например: f.write("%s %s\n" % (cod, md))

Хотя это помогает при отладке, я обнаружил, что печать заставляет программу работать медленнее, поэтому, возможно, не совсем печатается. Также я переместил бы «f = open (« datos.txt »,« a ») из цикла, как я могу себе представить. Открытие одного и того же файла снова и снова может вызвать некоторые проблемы времени, а затем переместить« f. close () "вне цикла и до конца программы.

ИЗМЕНИТЬ

  • Как производительность поиска словарных ключей сравнивается в Python?
  • Быстро проанализируйте дату и время Python в нелокальном часовом поясе, настроившись на летнее время
  • Как я могу наиболее эффективно проверять уникальные элементы в списке?
  • Почему медленнее перебирать небольшую строку, чем небольшой список?
  • Возможная оптимизация для расчета квадратичного евклидова расстояния
  • Временная сложность кода python для поиска самого длинного слова, которое может быть сделано из других слов в списке
  • Численность работает на половине скорости MATLAB
  • Почему hardcoding этот список медленнее, чем его вычисление?
  • Python - лучший язык программирования в мире.