在 concurrent.futures 中使用此功能时不起作用

This function does not work when using it in concurrent.futures

我正在使用 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 赋值的部分,它会打印完整的循环

删除 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')