Joblib简单示例并行示例比简单慢
Joblib simple example parallel example slower than simple
from math import sqrt
from joblib import Parallel, delayed
import time
if __name__ == '__main__':
st= time.time()
#[sqrt(i ** 2) for i in range(100000)] #this part in non parellel
Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in range(100000))
print time.time()-st
现在非并行部分运行 0.4 秒,而并行部分运行 18 秒。我很困惑为什么会发生这种情况
并行进程(joblib
创建)需要复制数据。想象一下:你有两个人,每个人都把一块石头带到他们的房子里,擦亮它,然后把它带回来。这比一个人在现场照亮它们的加载速度要慢。
所有时间都浪费在传输中,而不是花在实际计算上。对于更大量的计算任务,您只会从并行进程中获益。
如果您关心加快这个特定操作:
使用 numpy
的向量化数学运算。在我的机器上,并行:1.13 秒,串行:54.6 毫秒,numpy:3.74 毫秒。
a = np.arange(100000, dtype=np.int)
np.sqrt(a ** 2)
不用担心像 Cython 或 Numba 这样的库;他们不会加快这个已经高性能的操作。
from math import sqrt
from joblib import Parallel, delayed
import time
if __name__ == '__main__':
st= time.time()
#[sqrt(i ** 2) for i in range(100000)] #this part in non parellel
Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in range(100000))
print time.time()-st
现在非并行部分运行 0.4 秒,而并行部分运行 18 秒。我很困惑为什么会发生这种情况
并行进程(joblib
创建)需要复制数据。想象一下:你有两个人,每个人都把一块石头带到他们的房子里,擦亮它,然后把它带回来。这比一个人在现场照亮它们的加载速度要慢。
所有时间都浪费在传输中,而不是花在实际计算上。对于更大量的计算任务,您只会从并行进程中获益。
如果您关心加快这个特定操作:
使用 numpy
的向量化数学运算。在我的机器上,并行:1.13 秒,串行:54.6 毫秒,numpy:3.74 毫秒。
a = np.arange(100000, dtype=np.int)
np.sqrt(a ** 2)
不用担心像 Cython 或 Numba 这样的库;他们不会加快这个已经高性能的操作。