我想做并行处理来加快Python中的任务。
我用了apply_async
但 CPU 只消耗 30%。如何充分利用CPU?
下面是我的代码。
import numpy as np
import pandas as pd
import multiprocessing
def calc_score(df, i, j, score):
score[i,j] = df.loc[i, 'data'] + df.loc[j, 'data']
if __name__ == '__main__':
df = pd.read_csv('data.csv')
score = np.zeros([100, 100])
pool = multiprocessing.Pool(multiprocessing.cpu_count())
for i in range(100):
for j in range(100):
pool.apply_async(calc_score, (df, i, j, score))
pool.close()
pool.join()
谢谢。
您不能在pool = multiprocessing.Pool(multiprocessing.cpu_count())
中使用 100% 的 CPU。它会根据您给出的内核数量启动您的工作线程函数,但也会寻找一个空闲内核。如果要在多处理中使用最大 CPU,则应使用多处理进程类。它不断旋转新线。但请注意,如果您的 CPU 没有内存来旋转新线程,它会破坏系统。
CPU 利用率"应该与性能有关,即您希望在尽可能短的时间内完成工作。没有通用的方法可以做到这一点。如果有一种通用的方法来优化软件,那么就不会有缓慢的软件,对吧?
您似乎正在寻找不同的东西:花费尽可能多的CPU时间,这样它就不会闲置。这似乎是一回事,但绝对不是。
无论如何,如果您想花费 100% 的 CPU 时间,此脚本将为您执行此操作:
import time
import multiprocessing
def loop_until_t(t):
while time.time() < t:
pass
def waste_cpu_for_n_seconds(num_seconds, num_processes=multiprocessing.cpu_count()):
t0 = time.time()
t = t0 + num_seconds
print("Begin spending CPU time (in {} processes)...".format(num_processes))
with multiprocessing.Pool(num_processes) as pool:
pool.map(loop_until_t, num_processes*[t])
print("Done.")
if __name__ == '__main__':
waste_cpu_for_n_seconds(15)
相反,如果您希望程序运行得更快,则不会使用您所说的"并行处理插图">来做到这一点 - 您需要解决一个实际问题。