线程与多处理

问题描述 投票:0回答:2

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

python multithreading multiprocessing processing-efficiency
2个回答
1
投票

Threading

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

Multiprocessing

  • 正如Eman Hamed指出的那样,在多处理过程中共享对象可能很困难。

Vectorization

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

0
投票

进程线程共同有一个连续的(虚拟)内存块,称为堆进程。相对于整个进程(单独的脚本),线程也消耗更少的OS资源,并且不会发生上下文切换。

当没有涉及锁定/障碍时,多线程执行中的单个最大性能因素是数据访问局部性,例如。矩阵乘法核。

假设数据以线性方式存储在堆中,即。 [0-4095]字节中的第0行,[4096-8191]字节中的第1行等。然后,线程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。购买更新核心或更高频率的新处理器。

© www.soinside.com 2019 - 2024. All rights reserved.