我正在使用Parallel Python在多个内核上执行计算繁重的代码。我有一个i7-4600M处理器,它有 2 个内核和 4 个线程。
有趣的是,如果我使用 2 或 4 个线程,计算时间几乎相同。我写了一个小示例代码,演示了这种现象。
import itertools
import pp
import time
def cc(data, n):
count = 0
for A in data:
for B in itertools.product((-1,0,1), repeat=n):
inner_product = sum(a*b for a,b in zip(A,B))
if inner_product == 0:
count += 1
return count
n = 9
for thread_count in (1, 2, 3, 4):
print("Thread_count = {}".format(thread_count))
ppservers = ()
job_server = pp.Server(thread_count, ppservers=ppservers)
datas = [[] for _ in range(thread_count)]
for index, A in enumerate(itertools.product((0,1), repeat=n)):
datas[index%thread_count].append(A)
print("Data sizes: {}".format(map(len, datas)))
time_start = time.time()
jobs = [job_server.submit(cc,(data,n), (), ("itertools",)) for data in datas]
result = sum(job() for job in jobs)
time_end = time.time()
print("Time = {}".format(time_end - time_start))
print("Result = {}".format(result))
print
这是运行程序和cpu使用率的简短视频:https ://www.screenr.com/1ULN当我使用2个线程时,cpu有50%的使用率,如果我使用4个线程,它使用100%。但它只是稍微快一点。使用 2 个线程,我获得了 1.8 倍的加速,使用 3 个线程获得了 1.9 倍的加速,使用 4 个线程获得了 2 倍的加速。
如果代码太快,请使用n = 10
or n = 11
。但要小心,复杂度是6^n
. 所以n = 10
将需要 6 倍的时间n = 9
。