Как запустить программу на Python с указанным количеством ядер и отслеживать ее память и время выполнения?

#python #memory #multiprocessing #core

Вопрос:

Я хочу изменить количество ядер, используемых моей программой на Python, а затем измерить соответствующее использование памяти и время выполнения, которое программа потребляет при использовании указанного количества ядер. По сути, я просто хочу посмотреть, какое количество ядер в зависимости от использования памяти и времени выполнения оптимально для моей программы.

Моя идея до сих пор заключается в использовании многопроцессорного модуля Python (https://docs.python.org/3/library/multiprocessing.html) чтобы установить количество ядер, для которых мой процесс использует пакет psutil (https://pypi.org/project/psutil/).

Например:

 def process():
    # the process I want to measure 

if __name__ == '__main__':
    df_dict = {'num_cores': [], 'memory': [], 'execution_time': []}
    num_cores = [2, 4, 6, 8, 10, 12, 14, 16]

    for cores in num_cores:
        with Pool(cores) as p:
            start_time = time.time()
            p.map(process)
            mem = int(int(psutil.virtual_memory().total) / 1024 / 1024)
            end_time = time.time()
            total_time = end_time - start_time

            df_dict['num_cores'].append(cores)
            df_dict['memory'].append(mem)
            df_dict['execution_time'].append(total_time)

 

Но это не работает, так как я не включаю итерацию p.map(process) . Я также не уверен, что это правильный способ измерения использования памяти.

Как бы я выполнил эту задачу?

Комментарии:

1. «Но это не работает, так как я не включаю итерацию в p.map(процесс)» … хорошо ? Похоже, вы просто спрашиваете, как использовать multiprocessing . Вы проводили какие-нибудь исследования? Для начала, официальная документация? Как насчет поиска в Google конкретных вопросов о переполнении стека (их много)

2. Очень важно понимать, что среда выполнения CPython имеет глобальную блокировку интерпретатора (GIL), процесс CPython будет использовать только одно ядро процессора.

3. Вы захотите отслеживать память и время выполнения отдельно. tracemalloc Библиотека Python добавляет довольно ощутимую задержку и замедляет производительность.