更快的numpy数组副本;多线程memcpy?

时间:2017-03-20 03:19:21

标签: python arrays multithreading numpy memcpy

假设我们有两个相同数据类型和形状的大型numpy数组,大小约为GB的数量级。将所有值从一个值复制到另一个值的最快方法是什么?

当我使用常规表示法执行此操作时,例如A[:] = B,我看到计算机上只有一个核心,最大努力复制几秒钟,而其他核心闲置。当我使用multiprocessing启动多个工作人员并让他们各自将一个不同的片段复制到目标数组中时,使用多个工作人员复制所有数据的速度更快。无论目标数组是共享内存数组还是工作者本地数组,都是如此。在具有许多内核的机器上,我可以在一些测试中获得5-10倍的加速。随着我添加更多工作程序,速度最终会平稳甚至减慢,所以我认为这实现了内存性能的限制。

我建议不要使用multiprocessing来解决这个问题;它只是为了证明更好的硬件利用率。

是否存在某些多线程C / C ++ memcpy工具的python接口?

更新(2017年5月3日)

如果可能的话,使用多个python进程来移动数据可以大大提高速度。我有一个场景,我已经有几个小的共享内存缓冲区由工作进程写入。只要有人填满,主进程就会收集这些数据并将其复制到主缓冲区中。但是让主设备只选择主缓冲区中的位置,并指定一个记录工作者实际进行复制(从一大堆记录过程中),要快得多。在我的特定计算机上,并行工作程序可以在几分之一秒内移动几GB,而不是单个进程几秒钟。

尽管如此,这种设置并不总是(甚至通常都是)可能的,所以让一个python进程能够进入多线程memcpy例程会很棒......

1 个答案:

答案 0 :(得分:0)

如果您确定两个数组的类型/内存布局相同,则可能会提高速度:memoryview(A)[:] = memoryview(B)这应该直接使用memcpy并跳过对numpy广播或类型转换规则的所有检查。 / p>