假设我有一个包含100000行的表和一个python脚本,该脚本对该表的每一行依次执行一些操作。现在,为了加快该过程,我应该创建10个单独的脚本并同时运行它们以处理表的随后10000行,还是应该创建10个线程来处理行以提高执行速度?
答案 0 :(得分:1)
答案 1 :(得分:0)
进程线程通常有一个连续的(虚拟)内存块,称为堆进程没有。相对于整个进程(单独的脚本),线程还消耗更少的OS资源,并且没有上下文切换发生。
在没有多线程执行的情况下,最大的性能因素是 涉及的锁定/障碍是数据访问位置,例如矩阵乘法内核。
假设数据以线性方式(即)存储在堆中。 [0-4095]字节中的第0行,[4096-8191]字节中的第一行,依此类推。然后,线程0应该在0,10,20,...行中操作,线程1应该在1,11中操作,21,...行等
主要思想是在物理RAM中保留一组4K页,在L3高速缓存中保留64byte块,并对其进行重复操作。计算机通常认为,如果您“使用”特定的内存位置,那么您也将使用相邻的内存位置,那么您应该在程序中尽力做到这一点。最坏的情况是随机访问相距约10MiB的内存位置,因此不要这样做。例如。如果单行是1310720,则double(64B) 大小,则您的线程应以行内(单行)而不是行间(上方)的方式运行。
对代码进行基准测试,并根据您的结果,如果您的算法可以处理大约21.3GiB / s(DDR3-2666Mhz)的行,则您有一个内存绑定任务。如果您的代码像1GiB / s的处理速度,那么您有一个计算约束任务,这意味着对数据执行指令要比从RAM中获取数据花费更多的时间,并且您需要优化代码或通过使用AVXx指令集来达到更高的IPC或购买更新的处理器或具有更多核心或更高频率的处理器。