Почему многопроцессорность не быстрее? я делаю это неправильно?

Простыми словами это происходит потому, что в python все работает по ссылке, поэтому, когда вы создаете список списков таким образом, вы в основном получаете такие проблемы.

Чтобы решить вашу проблему, вы можете сделать либо один из них: 1. Используйте документацию numpy array для numpy.empty 2. Добавьте список, когда вы попадаете в список. 3. Вы также можете использовать словарь, если хотите

1
задан Kodi4444 24 March 2019 в 05:35
поделиться

2 ответа

Вы вызываете свою функцию на месте и даете результат многопроцессорной обработке. Вы должны передать функцию как вызываемую и аргументы отдельно:

multiprocessing.Process(target=per1, args=(x,))
0
ответ дан Klaus D. 24 March 2019 в 05:35
поделиться

Во-первых, отметим некоторое понимание того, какая математическая задача будет полезна для оптимизации, которая в противном случае может ускорить выполнение. Кратко рассмотрев, я могу определить, что есть несколько вещей, в том числе:

  • вы проверяете, написано ли "steps 1" в solve.txt, это никогда не может быть так, поскольку S равно как минимум 2 (или более ) и вы проверяете, если steps == S
  • для доступа к шагу N, вы должны были пройти все шаги от 2 до шага N-1 раньше. Это означает, что можно написать что-то вроде кода ниже. Это также сэкономит много ненужной проверки (возможно, меньше можно сделать, зная, в чем проблема, или сэкономив время проверки в памяти):
# since once 'S' isn't found, n >= S will not be in solve.txt
S = 2
while ("steps " + str(S)) in open('solve.txt').read() and S < 8:
    S += 1
  • solve.txt is открывается как минимум 2 раза во время программы, может быть больше, в зависимости от того, сколько вызовов в стеке есть на per1
  • Клаус D показал правильный способ вызова функции, но также обратите внимание, что вы вызываете .start() только когда [ 115] и y = 2002. Это немедленно приводит к тому, что значение result становится равным 0, и, следовательно, результаты не сохраняются (длина 0 равна 1), возвращаясь без ввода-вывода. Вы хотели бы сделать что-то вроде этого (не проверено):
    def driver(start, end, step):
        for i in range(start, end+1, step):
            per1(i)

    p1 = multiprocessing.Process(target=driver, args=(1, 2000, 2))
    p2 = multiprocessing.Process(target=driver, args=(0, 2000, 2))

    p1.start()
    p2.start()

    p1.join()
    p2.join()
  • Также обратите внимание, что многопроцессорный процесс стоит дорого, но он эффективен после запуска, поэтому должен используется, если вы знаете, что ваша программа будет выполняться долго для каждого процесса. Надеюсь, это поможет :)
0
ответ дан NightShade 24 March 2019 в 05:35
поделиться
Другие вопросы по тегам:

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