【发布时间】:2017-09-13 14:32:32
【问题描述】:
在使用不同数据类型的 numpy 数组进行多重处理时,我遇到了一个意外错误。首先,我使用int64 类型的numpy 数组执行多处理,然后使用float64 类型的numpy 数组再次运行它。 int64 按预期运行,而 float64 使用所有可用处理器(比我分配的多),导致计算速度比使用单核慢。
下面的例子重现了这个问题:
def array_multiplication(arr):
new_arr = arr.copy()
for nnn in range(3):
new_arr = np.dot(new_arr, arr)
return new_arr
if __name__ == '__main__':
from multiprocessing import Pool
import numpy as np
from timeit import timeit
# Example integer arrays.
test_arr_1 = np.random.randint(100, size=(100, 100))
test_arr_2 = np.random.randint(100, size=(100, 100))
test_arr_3 = np.random.randint(100, size=(100, 100))
test_arr_4 = np.random.randint(100, size=(100, 100))
# Parameter array.
parameter_arr = [test_arr_1, test_arr_2, test_arr_3, test_arr_4]
pool = Pool(processes=len(parameter_arr))
print('Multiprocessing time:')
print(timeit(lambda: pool.map(array_multiplication, parameter_arr),
number=1000))
print('Series time:')
print(timeit(lambda: list(map(array_multiplication, parameter_arr)),
number=1000))
将产生
Multiprocessing speed:
4.1271785919998365
Series speed:
8.102764352000122
这是预期的加速。
但是,将test_arr_n 替换为
test_arr_1 = np.random.normal(50, 30, size=(100, 100))
test_arr_2 = np.random.normal(50, 30, size=(100, 100))
test_arr_3 = np.random.normal(50, 30, size=(100, 100))
test_arr_4 = np.random.normal(50, 30, size=(100, 100))
结果
Multiprocessing time:
2.379720258999896
Series time:
0.40820308100001057
除了用完所有可用的处理器,我已经指定了 4。下面是运行第一种情况 (int64) 和第二种情况 (float64) 时处理器使用情况的屏幕截图。
以上是int64 的情况,其中给了四个处理器任务,然后一个处理器依次计算任务。
但是,在 float64 的情况下,所有处理器都在使用,即使指定的数量是 test_arr 的数量 - 即 4。
我已经在array_multiplication 中的for 循环中尝试了许多数组大小大小和迭代次数,并且行为是相同的。我正在运行具有 62.8 GB 内存和 i7-6800k 3.40GHz CPU 的 Ubuntu 16.04 LTS。
为什么会这样?提前致谢。
【问题讨论】:
-
澄清一下:您的问题不仅仅是问为什么浮点计算比整数计算需要更多的计算量吗?
-
@koalo 是的。我的问题是:为什么多处理比
float64的系列计算花费更多时间,但更重要的是,为什么只指定 4 个时使用所有处理器?
标签: python arrays numpy multiprocessing