我正在使用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的赋值,它将打印出完整的循环
答案 0 :(得分:0)
删除print(x//i,x,y)
,它将向您的控制台发送2 ** 21日志的垃圾邮件,并尝试先以l=4
之类的2的小幂循环。当我尝试使用较小的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')