Эта функция не работает при использовании ее в concurrent.futures - PullRequest
0 голосов
/ 07 ноября 2019

Я создаю набор массивов, используя concurrent.futures.ProcessPoolExecutor(), чтобы сделать это быстрее. Но по какой-то причине эта функция не работает должным образом внутри de ProcessPoolExecutor().

Мой код следующий:

def bitflip(int,p):
    mask = 1 << p
    return (int^ mask)

def check(num, n):
    return (num>>n)&1


def func(h):
    l = 20
    j = 1
    delt = -1

    A = np.zeros((2**8,2**8))
    i = 2**12
    for x in range(0,2**l):
        for y in range(0,l):
            k = (y+1)%l
            print(x//i,x,y)
            if check(x,y) == 0:
                A[x//i,x//i] += -j*h/2
            else:
                A[x//i,x//i] += j*h/2
            if check(x,y) == check(x,k):
                A[x//i,x//i] += -(j*delt)/2
            else:
                A[x//i,x//i] += (j*delt)/2
                b = bitflip(x,y)
                c = bitflip(b,k)
                A[x//i,c//i] += -j
    print(A)

t1 = time.perf_counter()
list_t = [16,13,12]
with concurrent.futures.ProcessPoolExecutor() as executor:
    executor.map(func,list_t)


t2 = time.perf_counter()

print(f'Finished in {t2-t1} seconds')

Вывод похож на ввод только один раз в первом цикле:

0 0 0
0 0 1
0 0 2
0 0 3
0 0 4
0 0 5
0 0 6
0 0 7
0 0 8
0 0 9
0 0 10
0 0 11
0 0 12
0 0 13
0 0 14
0 0 15
0 0 16
0 0 17
0 0 18
0 0 19
0 1 0
Finished in 0.21422048099339008 seconds

Но если я прокомментирую часть,присвойте значение массиву A, затем напечатайте полный цикл

1 Ответ

0 голосов
/ 08 ноября 2019

Удалите print(x//i,x,y), это будет спамить вашу консоль с 2 ** 21 журналами и попытаться сначала зацикливаться с небольшой степенью 2, такой как l=4. Когда я пробую ваш код маленькой l переменной и с if __name__ == '__main__': она работает нормально. Когда вы запускаете его с l=20, он тоже работает, но вычисление занимает очень много времени.

import time
import numpy as np
from concurrent import futures
def bitflip(int,p):
    mask = 1 << p
    return (int^ mask)

def check(num, n):
    return (num>>n)&1

def func(h):
    l = 20
    j = 1
    delt = -1

    A = np.zeros((2**8,2**8))
    i = 2**12
    for x in range(0,2**l):
        for y in range(0,l):
            k = (y+1)%l
            # print(x//i,x,y)
            if check(x,y) == 0:
                A[x//i,x//i] += -j*h/2
            else:
                A[x//i,x//i] += j*h/2
            if check(x,y) == check(x,k):
                A[x//i,x//i] += -(j*delt)/2
            else:
                A[x//i,x//i] += (j*delt)/2
                b = bitflip(x,y)
                c = bitflip(b,k)
                A[x//i,c//i] += -j
    print(A)

if __name__ == '__main__':
    t1 = time.perf_counter()
    list_t = [16,13,12]
    with futures.ProcessPoolExecutor() as executor:
        executor.map(func,list_t)
    t2 = time.perf_counter()
    print(f'Finished in {t2-t1} seconds')

...