描述:我已经有一个顺序的和线程化的python代码了。通常,对于数据帧中的每一行,循环都会遍历该数据帧,以将2个单元格组合为1个字符串,处理组合后的字符串并返回结果。
问题:整个过程非常缓慢(我认为可能需要4到10天),我想将数据帧分为4个或更多部分,以使线程处理每个部分。我尝试制作线程,但是在使用较小的数据帧进行测试后没有提高性能。简单/顺序脚本的总时间为30秒,线程在35秒内完成,这意味着线程较慢而不是较快。
问题:如何加快速度?
我尝试过的事情 顺序方法-成功运行但执行缓慢: 在一个简单的循环中,结果存储在单独的数据框中并另存为.csv。
线程方法-运行成功,但执行速度更慢: 我试图将数据框分成多个部分并创建线程。每个线程在赋予它的部分上工作。然后将结果提取并合并到最终数据框中,并另存为.csv。
队列(线程)方法-未执行: 我也尝试使用queue()进行编码,但是我距离成功执行还差很远。我显然需要更多地研究这个主题。会更快并且值得尝试吗?
#code with threads
import pandas as pd
import numpy as np
def myfunction(myvar):
if len(myvar) > 256:
return False
return True
def mythread(df, resultdf):
for index, x in df.iterrows():
for index2, y in data.iterrows():
if ( x['mycol'][:1] != y['mycol'][:1] ):
combined=x['mycol']+""+y['mycol']
if(myfunction(combined)):
resultdf = resultdf.append({'mycol': combined}, ignore_index=True)
return resultdf
#Start of main
data=pd.read_csv('data/small.csv')
combined_from_threads = pd.DataFrame(columns=['mycol'])
df1,df2,df3,df4=np.array_split(data, 4)
resultdf = pd.DataFrame(columns=['mycol'])
from multiprocessing.pool import ThreadPool
pool = ThreadPool(processes=4)
async_result1 = pool.apply_async(mythread, (df1, resultdf))
async_result2 = pool.apply_async(mythread, (df2, resultdf))
async_result3 = pool.apply_async(mythread, (df3, resultdf))
async_result4 = pool.apply_async(mythread, (df4, resultdf))
return1 = async_result1.get()
return2 = async_result2.get()
return3 = async_result3.get()
return4 = async_result4.get()
combined_from_threads = pd.concat([return1, return2, return3, return4], axis = 0, sort=True)
combined_from_threads.to_csv('result_threads.csv',index = False)
#sequential - simple
data=pd.read_csv('data/small.csv')
resultdf = pd.DataFrame(columns=['mycol'])
for index, x in data.iterrows():
print(str(index)+") "+x['mycol'])
for index2, y in data.iterrows():
if ( x['mycol'][:1] != y['mycol'][:1] ):
combined=x['mycol']+""+y['mycol']
#print(combined)
if(myfunction(combined)):
#print(combined+" found!")
resultdf = resultdf.append({'mycol': combined}, ignore_index=True)
resultdf.to_csv('result_sequential.csv',index = False)
在顺序方法中,我的一个CPU核心使用率峰值接近100%,而其他cpu核心处于空闲状态。执行时间(大致平均):30秒
在线程方法中,所有cpu核心使用率都达到25%,然后坐在那里直到python完成。以我的理解,由于创建的线程,它应该显示更高的用法,以使python代码更快地完成。执行时间(大致平均):35秒,但不超过10秒