Python starmap_async绕过打印功能
下面是我正在运行的代码:Python starmap_async绕过打印功能,python,python-3.x,asynchronous,iterator,multiprocessing,Python,Python 3.x,Asynchronous,Iterator,Multiprocessing,下面是我正在运行的代码: from itertools import product from functools import partial import numpy as np import pandas as pd import multiprocessing as mp def func1(n0_tup, n1_tup, n3, df): df = df.copy() df = df.astype(object) X = pd.DataFrame({'co
from itertools import product
from functools import partial
import numpy as np
import pandas as pd
import multiprocessing as mp
def func1(n0_tup, n1_tup, n3, df):
df = df.copy()
df = df.astype(object)
X = pd.DataFrame({'col0': np.repeat(-n0_tup[1],n1_tup[0]),
'col1': n3*np.arange(n1_tup[0]),
'col2': n3*np.repeat(n1_tup[1],n1_tup[0]),
'col3': [f'random string {i}' for i in range(n1_tup[0])]})
X['col4'] = func2(n1_tup[0], X.shape[0])
temp = (n0_tup[1],n1_tup[0],n1_tup[1],n3)
ind = (n0_tup[0],n1_tup[0],n1_tup[1])
df[f'special col {temp}'] = n0_tup[1]+n1_tup[0]+n1_tup[1]+n3
df2 = df
df2[f'special col2 {temp}'] = n0_tup[1]+n1_tup[0]+n1_tup[1]+n3
df3 =df2
df3[f'special col3 {temp}'] = n0_tup[1]+n1_tup[0]+n1_tup[1]+n3
print(temp)#<----This line gets skipped over by starmap_async
return ind, temp, X['col2'].sum()+ df3[f'special col3 {temp}'].sum()
def main3():
xd = pd.DataFrame({'col1': list('just a string')})
A_lst = np.arange(1,10+1)
A_size = A_lst[-1]+1
B_rge = np.arange(660,670)
B_size = len(B_rge)
lst1 = (item for item in product(A_lst, repeat = 2) if item[0] < item[1])
lst2 = enumerate(np.arange(660,670))
arg_list = product(lst2, lst1)
with mp.Pool(processes = mp.cpu_count()) as pool:
result = pool.starmap_async(partial(func1, n3 = 100, df = xd), arg_list).get()
result_fin = np.zeros([B_size, A_size - 1, A_size])
for item in result:
ind = item[0]
result_fin[ind[0], ind[1], ind[2]] =item[2]
return result, result_fin
if __name__ == '__main__':
result_main3 = main3()
来自itertools导入产品的
从functools导入部分
将numpy作为np导入
作为pd进口熊猫
将多处理作为mp导入
def func1(n0、n1、n3、df):
df=df.copy()
df=df.astype(对象)
X=pd.DataFrame({'col0':np.repeat(-n0_-tup[1],n1_-tup[0]),
'col1':n3*np.arange(n1_tup[0]),
“col2”:n3*np.repeat(n1_-tup[1],n1_-tup[0]),
'col3':[f'random string{i}'表示范围内的i(n1_tup[0])})
X['col4']=func2(n1_tup[0],X.shape[0])
温度=(n0\u-tup[1],n1\u-tup[0],n1\u-tup[1],n3)
ind=(n0\u-tup[0],n1\u-tup[0],n1\u-tup[1])
df[f'特殊列{temp}']=n0_-tup[1]+n1_-tup[0]+n1_-tup[1]+n3
df2=df
df2[f'special col2{temp}']=n0_-tup[1]+n1_-tup[0]+n1_-tup[1]+n3
df3=df2
df3[f'special col3{temp}']=n0_-tup[1]+n1_-tup[0]+n1_-tup[1]+n3
print(temp)#这对我来说很有效(Python 3.7.3、numpy 1.16.3、Pandas 0.24.2、Linux 5.0.13),通过工作,我的意思是我从print
获得输出。顺便说一句,func2
没有定义,所以我只是将该列设置为42…请注意,您的df2=df
可能没有达到预期效果,它可能值得一看:。此外,通过池传递的每个值都是隐式复制的(所有内容都通过pickle
和back序列化),因此可能无需显式执行此操作,池也默认使用cpu\u count
作为进程数。和pool.starmap\u async(…).get()
与pool.starmap(…)
相同,谢谢您的输入。之所以忽略打印,可能是因为我使用的是Python 3.6.8,而不是3.7.3。但我确实有一个问题;为什么pool.startmap_asyc(…)与pool.starmap(…)相同?我的意思是一个是异步的,另一个是同步的。异步多处理不应该比同步多处理运行得稍快一点吗?同样,感谢您指出df2=df。应该使用df2=df.copy()作为一种很好的实践,通过池运行的所有内容都是在一组并行/异步进程中执行的。这正是您想要/需要返回结果的时候。如果说您希望在将来某个时候得到结果(starmap\u async
),然后立即等待结果(.get()
),这与说您立即需要结果是一样的(starmap
)。他们说他们是相同的,所以你只是不必要地使你的代码复杂化了这对我来说是可行的(Python 3.7.3,numpy 1.16.3,Pandas 0.24.2,Linux 5.0.13),我的意思是我从打印中获得输出。顺便说一句,func2
没有定义,所以我只是将该列设置为42…请注意,您的df2=df
可能没有达到预期效果,它可能值得一看:。此外,通过池传递的每个值都是隐式复制的(所有内容都通过pickle
和back序列化),因此可能无需显式执行此操作,池也默认使用cpu\u count
作为进程数。和pool.starmap\u async(…).get()
与pool.starmap(…)
相同,谢谢您的输入。之所以忽略打印,可能是因为我使用的是Python 3.6.8,而不是3.7.3。但我确实有一个问题;为什么pool.startmap_asyc(…)与pool.starmap(…)相同?我的意思是一个是异步的,另一个是同步的。异步多处理不应该比同步多处理运行得稍快一点吗?同样,感谢您指出df2=df。应该使用df2=df.copy()作为一种很好的实践,通过池运行的所有内容都是在一组并行/异步进程中执行的。这正是您想要/需要返回结果的时候。如果说您希望在将来某个时候得到结果(starmap\u async
),然后立即等待结果(.get()
),这与说您立即需要结果是一样的(starmap
)。代码表示它们是相同的,所以您只是不必要地使代码复杂化了