Код: Выделить всё
from math import factorial
from decimal import Decimal, getcontext
from joblib import Parallel, delayed
from tqdm import trange
import time
def calc(n_digits):
# number of iterations
n = int(n_digits+1/14.181647462725477)
n = n if n >= 1 else 1
# set the number of digits for our numbers
getcontext().prec = n_digits+1
t = Decimal(0)
pi = Decimal(0)
deno = Decimal(0)
for k in trange(n):
t = ((-1)**k)*(factorial(6*k))*(13591409+545140134*k)
deno = factorial(3*k)*(factorial(k)**3)*(640320**(3*k))
pi += Decimal(t)/Decimal(deno)
pi = pi * Decimal(12) / Decimal(640320 ** Decimal(1.5))
pi = 1/pi
# no need to round
return pi
def parallel_with_joblib():
# Define the number of cores to use
n_cores = 4
# Define the tasks (e.g., compute first 100, 200, 300, 400 digits of pi)
tasks = [1200, 1700, 900, 1400]
# Run tasks in parallel
results = Parallel(n_jobs=n_cores)(delayed(calc)(n) for n in tasks)
if __name__ == "__main__":
parallel_with_joblib()
Следуя методу @Swifty, изменив количество ядер на 3 и количество задач на 7 и изменив параметр Leave=False на Leave=True, у меня есть этот код:
Код: Выделить всё
from math import factorial
from decimal import Decimal, getcontext
from joblib import Parallel, delayed
from tqdm import trange
import time
def calc(n_digits, pos, total):
# number of iterations
n = int(n_digits + 1 / 14.181647462725477)
n = n if n >= 1 else 1
# set the number of digits for our numbers
getcontext().prec = n_digits + 1
t = Decimal(0)
pi = Decimal(0)
deno = Decimal(0)
for k in trange(n, position=pos, desc=f"Job {pos + 1} of {total}", leave=True):
t = ((-1) ** k) * (factorial(6 * k)) * (13591409 + 545140134 * k)
deno = factorial(3 * k) * (factorial(k) ** 3) * (640320 ** (3 * k))
pi += Decimal(t) / Decimal(deno)
pi = pi * Decimal(12) / Decimal(640320 ** Decimal(1.5))
pi = 1 / pi
# no need to round
return pi
def parallel_with_joblib():
# Define the number of cores to use
n_cores = 3
# Define the tasks (e.g., compute first 100, 200, 300, 400 digits of pi)
tasks = [1200, 1700, 900, 1400, 800, 600, 500]
# Run tasks in parallel
results = Parallel(n_jobs=n_cores)(delayed(calc)(n, pos, len(tasks)) for (pos, n) in enumerate(tasks))
if __name__ == "__main__":
parallel_with_joblib()
Однако это дает мне:
p>

и а в конце получается еще больше беспорядка:

Как это можно исправить ?
Подробнее здесь: https://stackoverflow.com/questions/793 ... r-progress
Мобильная версия