performance - 在 python 中 multiprocessing.pool.starmap() 后仅使用 20% 的 CPU
问题描述
该程序的目的是通过一个目录运行,如果一个文件是一个 Excel 电子表格,它应该打开它,提取和操作一些数据,然后移动到下一个文件。由于这是一个费力的过程,我试图将任务拆分为多个线程。即使在这之后只使用了总 CPU 容量的 20%,而且它并没有特别快。
def extract_data(unique_file_names):
global rootdir
global newarray
global counter
global t0
string = rootdir + "\\" + str(unique_file_names[0])
wb = load_workbook(string, read_only = True, data_only=True)
ws = wb["Sheet1"]
df = pd.DataFrame(ws.values)
newarray = df.loc[4:43,:13].values
counter = 0
print("Starting pool")
pool = ThreadPool(processes=20)
pool.map(process, unique_file_names)
pool.close()
def process(filename):
global newarray
global unique_file_names
global counter
global t0
counter+=1
try:
file_name = rootdir + "/" + str(filename)
wb = load_workbook(file_name, read_only = True, data_only=True)
ws = wb["Sheet1"]
df = pd.DataFrame(ws.values)
newarray = np.hstack((newarray, df.loc[4:43,4:13].values))
except:
print("Failure")
pass
print("Time %.2f, Completed %.2f %% " %((time.clock()-t0),counter*100/len(unique_file_names)))
所以处理一个电子表格大约需要一秒半的时间,但就像我说的 pool.map() 几乎没有区别。有什么建议么?
提前致谢
解决方案
推荐阅读
- python - Django REST 框架中的私有和公共字段
- reactjs - webpack 源图生成
- webpack - 如何在 borwser 中配置 webpack - libraryTarget + splitChunks + requaire
- vue.js - 无法在 b 表上生成路由器链接按钮
- javascript - 如何在 Google Sheets API 中正确使用 sheet.spreadsheets.values.GET?
- excel - 计算发生之间的天数
- imacros - Imacros 将部分添加到 URL
- javascript - NestJS 记录器:显示行号
- java - 为什么在列表中将字符串简单转换为整数时出现错误
- fullpage.js - Fullpage.js 滚动时的粘性标题背景颜色变化