当前位置: 首页 > 面试题库 >

Python代码的性能随线程而降低

唐照
2023-03-14
问题内容

我已经用Python编写了一个工作程序,该程序基本上可以解析一批二进制文件,然后将数据提取到数据结构中。每个文件大约需要一秒钟的时间来解析,这意味着数千个文件要花费数小时。我已经成功实现了线程解析的线程版本的批处理解析方法。我在100个具有不同线程数的文件上测试了该方法,并对每次运行进行了计时。结果如下(0个线程是指我的原始,预线程化代码,1个线程是指生成一个线程的新版本)。

0 threads: 83.842 seconds
1 threads: 78.777 seconds
2 threads: 105.032 seconds
3 threads: 109.965 seconds
4 threads: 108.956 seconds
5 threads: 109.646 seconds
6 threads: 109.520 seconds
7 threads: 110.457 seconds
8 threads: 111.658 seconds

尽管生成线程比使主线程完成所有工作能带来较小的性能提升,但增加线程数实际上会 降低
性能。我本来希望看到性能提高,至少可以达到四个线程(每个机器内核一个)。我知道线程有相关的开销,但是我认为线程位数没有太大的关系。

我听说过“全局解释器锁定”,但是当我向上移动四个线程时,我确实看到了相应数量的内核在工作-具有两个线程,两个内核在解析期间显示活动,依此类推。

我还测试了一些不同版本的解析代码,以查看我的程序是否受IO限制。似乎并非如此;仅读取文件所需的时间就相对较少;处理文件几乎是全部。如果不执行IO并处理文件的已读取版本,则添加第二个线程会降低性能,而第三个线程会稍微改善它。我只是想知道为什么我不能利用计算机的多核来加快处理速度。请发布任何我可以澄清的问题或方式。


问题答案:

令人遗憾的是,这主要是由于全局解释器锁(GIL)导致的CPython中的情况。受CPU约束的Python代码根本无法跨线程扩展(另一方面,受I /
O约束的代码可能会在一定程度上扩展)。

David
Beazley的演讲内容丰富,讨论了GIL的一些问题。视频可以在这里找到(感谢@Ikke!)

我的建议是使用multiprocessing模块而不是多个线程。



 类似资料:
  • 本文向大家介绍python编程线性回归代码示例,包括了python编程线性回归代码示例的使用技巧和注意事项,需要的朋友参考一下  用python进行线性回归分析非常方便,有现成的库可以使用比如:numpy.linalog.lstsq例子、scipy.stats.linregress例子、pandas.ols例子等。 不过本文使用sklearn库的linear_model.LinearRegress

  • 本文向大家介绍如何最大限度地降低多线程C#代码的复杂性,包括了如何最大限度地降低多线程C#代码的复杂性的使用技巧和注意事项,需要的朋友参考一下 分支或多线程编程是编程时最难最对的事情之一。这是由于它们的并行性质所致,即要求采用与使用单线程的线性编程完全不同的思维模式。对于这个问题,恰当类比就是抛接杂耍表演者,必须在空中抛接多个球,而不要让它们相互干扰。这是一项重大挑战。然而,通过正确的工具和思维模

  • 以下代码是竞赛中问题陈述的解决方案。给出的时间限制为1s。该代码在5/7个测试用例中正常工作。对于其他情况,超过了时间限制。如何降低下面代码的时间复杂度? 编辑:问题陈述被定义为返回数字n的值或n/2、n/3、n/4之和,以最大值为准。例如,如果输入为24,则可以进一步减少或交换为12 8 6=26,12可以减少为6 4 3=13。8和6不应减少,因为这可能会降低值。最后的答案是13 8 6=27

  • 我有以下代码,我需要重构它,以降低复杂性,增加模块化和封装性。我还需要减少ck度量值。 你如何重构这个代码?切换案例是否降低了复杂性?

  • 梯度下降法 梯度下降就好比从一个凹凸不平的山顶快速下到山脚下,每一步都会根据当前的坡度来找一个能最快下来的方向。随机梯度下降英文是Stochastic gradient descend(SGD),在scikit-learn中叫做SGDRegressor。 样本实验 依然用上一节的房价样本 X = [[50],[100],[150],[200],[250],[300]] y = [[150],[2

  • 这个问题与现有的问题“使用C11的‘自动’能提高性能吗?” 这个问题的一个答案表明,使用不仅会有积极的影响,也会有消极的影响。 我认为我们需要一个单独的问题,答案集中在自动的那一面。