I / O или CPU связаны?Как проверить, работает ли одновременно? - PullRequest
0 голосов
/ 25 сентября 2019

Я новичок в Python и изо всех сил пытаюсь понять некоторые вещи в многопроцессорной / многопоточности.Я хочу ускорить функцию и пробовал разные подходы от многопроцессорного модуля, но я не могу заставить его работать быстрее.Возможно, он не будет работать быстрее, но я хотел убедиться, что это так, прежде чем сдаться.Это не полное описание, но наиболее трудоемкими являются следующие действия:

- многократное генерирование случайных данных (10000 строк и 10 столбцов)

- использование модели предварительного подбора для прогнозированиярезультат для каждой строки и

- сравнение каждого прогнозируемого значения с начальным значением.

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

Я хочу перебрать несколько из этих начальных значений и в итоге получить список выходных значений.Я надеялся, что несколько итераций будут выполняться одновременно (но я открыт для всего, что может сделать его быстрее).Я невежественно пытался использовать pool.apply, starmap и Process, но не видел изменений во времени.

Мои вопросы:

  1. На основании описания того, что я делаю, связан ли мой программный ввод-вывод или процессор?(Можно ли из этого сказать? Правильный ли это вопрос?)

  2. Должен ли я использовать многопоточность или многопроцессорность?

  3. Как определить, выполняются ли итерации одновременно или нет?

1 Ответ

0 голосов
/ 25 сентября 2019

Учитывая, что вы ничего не упомянули о дисках, я собираюсь предположить, что они не очень ограничены вводом-выводом (хотя все еще возможно).Вы используете несколько потоков / процессов еще?Если нет, то это определенно ваша проблема.

Я бы, вероятно, посмотрел на Pythons Библиотека потоков и из-за цикла для создания данных, возможно, библиотека пула потоков .Вам просто нужно, чтобы все ваши потоки запускали эту функцию rand одновременно.

EDIT: Я забыл упомянуть.Если вы откроете Диспетчер задач / Системный монитор, вы сможете увидеть нагрузку на процессор / поток.Если в один момент времени только один максимальный, вы не одновременно.

Пример: Я написал быстрый пример, чтобы помочь с пулом потоков.Ваш список из 10000 пунктов с 10 столбцами даже не был заметен на моем i7.Я увеличил столбцы до 10000, и он использовал 4 ГБ ОЗУ и, вероятно, 30 секунд 100% ЦП при 3,4 ГГц.

from multiprocessing import Pool, Array
import random


def thread_function(_):
    """Return a random number."""
    l = []
    for _ in range(10000):
        l.append(random.randint(0, 10000))
    return l

if __name__ == '__main__':
    rand_list = Array('i', range(10000))

    with Pool() as pool:
        rand_list = pool.map(thread_function, rand_list)
    print(len(rand_list))
...