Я пытаюсь применить функцию к большим range
числам - и версия, в которой я использую пул из multiprocessing
, занимает гораздо больше времени до окончания sh, чем то, что я оцениваю для версии "с одним процессом" -
Это проблема с моим кодом? Или Python? Или Linux?
Используемая мной функция is_solution
определена ниже -
as_ten_digit_string = lambda x: f"0000000000{x}"[-10:]
def sum_of_digits(nstr):
return sum([int(_) for _ in list(nstr)])
def is_solution(x):
return sum_of_digits(as_ten_digit_string(x)) == 10
Когда я запускаю is_solution
для миллиона чисел - это занимает около 2 секунд
In [13]: %timeit [is_solution(x) for x in range(1_000_000)]
1.9 s ± 18.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Исходя из этого - для ~ 10 миллиардов номеров - это должно занять около 20000 секунд или около 6 часов. Но версия multiprocessing
не заканчивается даже через 9 часов.
Я использую такой многопроцессорный модуль -
from multiprocessing import Pool
with Pool(processes=24) as p:
for solution in p.imap_unordered(is_solution, range(1_000_000_000, 9_999_999_999)):
if solution:
print(solution)
Используемая версия python - 3.8
на linux.
Я не знаю, относится ли это к делу - когда я запускаю команду top
в linux - я вижу, что когда моя основная программа работает в течение ~ 200 минут - каждый из моих рабочих процессов имеет Время работы процессора около 20 минут.