多重处理与 NumPy 不兼容[重复]

2023-12-26

我正在尝试使用多处理运行一个简单的测试。测试运行良好,直到我导入 numpy (即使它没有在程序中使用)。这是代码:

from multiprocessing import Pool
import time
import numpy as np #this is the problematic line


def CostlyFunc(N):
    """"""
    tstart = time.time()
    x = 0
    for i in xrange(N):
        for j in xrange(N):
            if i % 2: x += 2
            else: x -= 2       
    print "CostlyFunc : elapsed time %f s" % (time.time() - tstart)
    return x

#serial application
ResultList0 = []
StartTime = time.time()
for i in xrange(3):
    ResultList0.append(CostlyFunc(5000))
print "Elapsed time (serial) : ", time.time() - StartTime


#multiprocessing application
StartTime = time.time()
pool = Pool()
asyncResult = pool.map_async(CostlyFunc, [5000, 5000, 5000])
ResultList1 = asyncResult.get()
print "Elapsed time (multiporcessing) : ", time.time() - StartTime

如果我不导入 numpy 结果是:

CostlyFunc : elapsed time 2.866265 s
CostlyFunc : elapsed time 2.793213 s
CostlyFunc : elapsed time 2.794936 s
Elapsed time (serial) :  8.45455098152
CostlyFunc : elapsed time 2.889815 s
CostlyFunc : elapsed time 2.891556 s
CostlyFunc : elapsed time 2.898898 s
Elapsed time (multiporcessing) :  2.91595196724

总运行时间与 1 个进程所需的时间相似,这意味着计算已经并行化。如果我导入 numpy 结果将变为:

CostlyFunc : elapsed time 2.877116 s
CostlyFunc : elapsed time 2.866778 s
CostlyFunc : elapsed time 2.860894 s
Elapsed time (serial) :  8.60492110252
CostlyFunc : elapsed time 8.450145 s
CostlyFunc : elapsed time 8.473006 s
CostlyFunc : elapsed time 8.506402 s
Elapsed time (multiporcessing) :  8.55398178101

由于仅使用一个核心,因此串行方法和多处理方法所花费的总时间相同。很明显问题出在numpy上。我的多重处理版本和 NumPy 版本之间是否有可能不兼容?

我目前在 Linux 上使用 Python2.7、NumPy 1.6.2 和多处理 0.70a1


(第一篇文章,如果表述不当或对齐不当,敬请谅解)

您可以通过将 MKL_NUM_THREADS 设置为 1 来停止 Numpy 使用多线程

在 debian 下我使用:

export MKL_NUM_THREADS=1

来源自相关 stackoverflow 帖子:Python:如何阻止 numpy 进行多线程处理? https://stackoverflow.com/questions/17053671/python-how-do-you-stop-numpy-from-multithreading

Result:

user@pc:~/tmp$ python multi.py
CostlyFunc : elapsed time 3.847009 s
CostlyFunc : elapsed time 3.253226 s
CostlyFunc : elapsed time 3.415734 s
Elapsed time (serial) :  10.5163660049
CostlyFunc : elapsed time 4.218424 s
CostlyFunc : elapsed time 5.252429 s
CostlyFunc : elapsed time 4.862513 s
Elapsed time (multiporcessing) :  9.11713695526

user@pc:~/tmp$ export MKL_NUM_THREADS=1

user@pc:~/tmp$ python multi.py
CostlyFunc : elapsed time 3.014677 s
CostlyFunc : elapsed time 3.102548 s
CostlyFunc : elapsed time 3.060915 s
Elapsed time (serial) :  9.17840886116
CostlyFunc : elapsed time 3.720322 s
CostlyFunc : elapsed time 3.950583 s
CostlyFunc : elapsed time 3.656165 s
Elapsed time (multiporcessing) :  7.399310112

我不确定这是否有帮助,因为我想最终您希望 numpy 并行运行,也许尝试调整 numpy 到您的机器的线程数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多重处理与 NumPy 不兼容[重复] 的相关文章

随机推荐