假设我有一个带有100000行的表和一个python脚本,该表在此表的每一行上执行某些操作。现在,为了加快此过程,我应该创建10个单独的脚本并同时运行该表的过程后续10000行,或者我应该创建10个线程以处理行以提高执行速度?
螺纹
- 由于全局解释器锁,Python线程并不是真正的平行。换句话说,只能一次运行一个线程。
- 如果您执行CPU绑定的任务,则将工作负载分配在线程之间不会加快您的计算。如果有的话,它会减慢它们的速度,因为解释器还有更多的线程可以切换。
- 线程对于IO绑定的任务更有用。例如,如果您同时与许多不同的客户端/服务器进行通信。在这种情况下,您可以在等待不同的客户端/服务器响应时在线程之间切换
多处理
- 正如Eman Hamed指出的那样,在多处理时可能很难共享对象。
矢量化
- 像Pandas这样的库允许您在表上使用矢量化方法。这些是在C中编写的高度优化的操作,在整个表或列上执行非常快。根据桌子的结构和要执行的操作,您应该考虑利用此
进程线程具有一个持续的(虚拟)内存块,称为堆过程。线程还相对于整个过程(单独的脚本)消耗的OS资源较少,并且没有上下文切换发生。
当没有涉及的锁定/障碍是数据访问区域,例如。矩阵乘法内核。
假设数据以线性方式存储IE。[0-4095]字节中的0-排在[4096-8191]字节等中的第1行,然后thread-0应该在0,10,20,...行,rows,thread-1在1,11中运行,21,...行等。
主要想法是在物理RAM中保存了一组4K页,并在L3缓存中保存了64个Byte块,然后反复进行操作。计算机通常假设,如果您"使用"特定的内存位置,那么您也将使用相邻的位置,并且应该尽力在程序中做到这一点。最坏的情况是以随机方式访问大约10MIB的内存位置,所以不要那样做。例如。如果一行是1310720双打(64b)大小,然后您的线程应以一排(单行)而相对于行间(以上)方式进行操作。
基于您的代码,并取决于您的结果,如果您的算法可以处理行约21.3Gib/s(DDR3-266666666666MHz),则您有一个内存的任务。如果您的代码类似于1GIB/s处理速度,则您有一个计算任务,这意味着在数据上执行指令比从RAM获取数据需要的时间多,并且您需要通过使用AVXX说明集或使用AVXX指令集或达到更高的IPC购买具有更多核心或更高频率的较新的流程机。