线程与多处理

2024-05-20 13:07:36 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个包含100000行的表和一个python脚本,该脚本按顺序对该表的每一行执行一些操作。现在,为了加快这个过程,我应该创建10个单独的脚本并同时运行它们来处理表的后续10000行,还是创建10个线程来处理行以提高执行速度?你知道吗


Tags: 脚本顺序过程线程速度处理表
2条回答

进程线程通常有一个称为堆进程的连续(虚拟)内存块,而进程没有。相对于整个进程(单独的脚本),线程消耗的操作系统资源也较少,并且没有发生上下文切换。你知道吗

在多线程执行中,当没有 所涉及的锁定/障碍是数据访问局部性,例如矩阵乘法核。你知道吗

假设数据以线性方式存储在堆中,即第0行以[0-4095]字节存储,第1行以[4096-8191]字节存储,等等,那么线程0应该以0,10,20。。。行,线程-1在1,11,21,。。。行等

其主要思想是将一组4K页保存在物理RAM中,64字节块保存在L3缓存中,并对它们进行重复操作。计算机通常认为,如果你“使用”了一个特定的内存位置,那么你也会使用相邻的内存位置,你应该在程序中尽最大努力做到这一点。最坏的情况是以随机方式访问相距约10MiB的内存位置,所以不要这样做。如果一行是1310720双(64B)英寸 那么线程应该以行内(单行)而不是行间(上方)的方式运行。你知道吗

对您的代码进行基准测试,根据您的结果,如果您的算法可以处理大约21.3GiB/s(DDR3-2666Mhz)的行,那么您就有一个内存受限的任务。如果您的代码处理速度接近1GiB/s,那么您就有一个计算限制任务,这意味着对数据执行指令比从RAM获取数据需要更多的时间,您需要优化代码或通过使用AVXx指令集达到更高的IPC,或者购买一个更新的处理器或具有更多内核或更高频率的处理器。你知道吗

穿线

  • 由于全局解释器锁,python线程不是真正的并行线程。换句话说,一次只能运行一个线程。你知道吗
  • 如果您正在执行CPU受限的任务,那么在线程之间分配工作负载将不会加快计算速度。如果有什么问题的话,它会减慢它们的速度,因为有更多的线程供解释器切换。你知道吗
  • 线程对于IO绑定的任务更有用。例如,如果您同时与多个不同的客户机/服务器通信。在这种情况下,您可以在等待不同的客户机/服务器响应时在线程之间切换

多处理

  • 正如Eman Hamed所指出的,在进行多处理时,共享对象是很困难的。你知道吗

矢量化

  • 像pandas这样的库允许您在表上使用向量化方法。这些是用C编写的高度优化的操作,在整个表或列上执行得非常快。根据表的结构和要执行的操作,应该考虑利用这一点

相关问题 更多 >