#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 добавляет довольно ощутимую задержку и замедляет производительность.