在 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')
我正在使用 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')