python 多线程比顺序代码更快...为什么?

2024-06-22

在许多有关 python 多线程的堆栈溢出问答中,我读到 python 有 GIL,因此多线程比顺序代码慢。

但在我的代码中它看起来并不像

这是多线程代码 代码已更新2023年2月21日

import threading
import time

global_v = 0
thread_lock = threading.Lock()


def thread_test(num):
    thread_lock.acquire()
    global global_v
    for _ in range(num):
        global_v += 1
    thread_lock.release()


# thread run
thread_1 = threading.Thread(target=thread_test, args=(9_000_000,))
thread_2 = threading.Thread(target=thread_test, args=(9_000_000,))
thread_3 = threading.Thread(target=thread_test, args=(9_000_000,))
thread_4 = threading.Thread(target=thread_test, args=(9_000_000,))
thread_5 = threading.Thread(target=thread_test, args=(9_000_000,))

thread_start = time.perf_counter()
# start thread
thread_1.start()
thread_2.start()
thread_3.start()
thread_4.start()
thread_5.start()
thread_end = time.perf_counter()

thread_1.join()
thread_2.join()
thread_3.join()
thread_4.join()
thread_5.join()
print(f"multithread run takes {thread_end-thread_start:.5f} sec")


# nomal run (sequential code)
def increment():
    global nomal_result

    for _ in range(45_000_000):
        nomal_result += 1


nomal_result = 0

start_time = time.perf_counter()
increment()
end_time = time.perf_counter()

print(f"nomal run takes {end_time-start_time:.5f} sec")

结果是

multithread run takes 0.21226 sec
nomal run takes 2.09347 sec

因此我的问题是这样的

Q1.为什么Python中的线程比顺序代码更快?

Q2。带锁的多线程和顺序代码有什么区别(我认为如果使用锁,代码的工作方式就像带阻塞的顺序代码)

请告诉我 !

感谢您

蟒蛇版本3.8.10

附注我移动第三个问题Python多线程加锁速度更快,为什么? https://stackoverflow.com/questions/75516141/python-multi-threading-with-lock-is-much-faster-why


看起来这是由 CPython 处理全局变量的方式引起的。这个顺序版本比我的机器上使用 CPython 3.11 的并发版本更快:

def increment():
    nomal_result = 0

    for _ in range(5_000_000):
        nomal_result += 1


nomal_result = 0

start_time = time.perf_counter()
increment()
end_time = time.perf_counter()

print(f"nomal run takes {end_time-start_time:.5f} sec")

因此,您的多线程代码并不比顺序代码快。性能差距可能是由于两个版本之间的 CPython 优化不同造成的,而且大多是无关紧要的。

GIL 不会阻止all代码有效地多线程。这是一个简单的反例:

import threading
import time


def thread_test():
    time.sleep(1.0)


thread_start = time.perf_counter()

thread_1 = threading.Thread(target=thread_test)
thread_2 = threading.Thread(target=thread_test)

thread_1.start()
thread_2.start()

thread_1.join()
thread_2.join()

thread_end = time.perf_counter()

print(f"Task duration: {thread_end - thread_start:.5f} sec")

相比:

import time


def thread_test():
    time.sleep(1.0)


thread_start = time.perf_counter()
thread_test()
thread_test()
thread_end = time.perf_counter()

print(f"Task duration: {thread_end - thread_start:.5f} sec")

多线程版本只需要1秒,而顺序版本需要2秒。

一般来说,大量调用 C 函数并释放 GIL 的代码(如 NumPy)和 IO 绑定的代码(网络调用)将受益于 Python 中的多线程。相反,CPU 密集型任务(例如您的代码)不会从中受益。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 多线程比顺序代码更快...为什么? 的相关文章

  • Python XLWT调整列宽

    XLWT 的易用性给我留下了深刻的印象 但有一件事我还没有弄清楚该怎么做 我正在尝试将某些行调整为显示所有字符所需的最小宽度 换句话说 如果双击单元格之间的分隔线 excel 会做什么 我知道如何将列宽调整为预定量 但我不确定如何确定显示所
  • Python Turtle 中的 onkeypress() 和 Listen() 问题

    我的一个功能有问题 我使用 Python 3 7 当我尝试使用onkeypress 函数 什么也没有发生 我尝试检查它 但是当我按键时乌龟模块没有反应 我尝试使用 w 键向上移动桨 但这不起作用 以下是我的 py 文件 main py im
  • 如何在 Pandas 中用多个唯一字符串替换重复值?

    import pandas as pd import numpy as np data Name Tom Tom Jack Terry Age 20 21 19 18 df pd DataFrame data 假设我有一个如下所示的数据框
  • 如何针对 Heroku 路由器的代理/缓冲情况优化 uWSGI?

    我在 Heroku 的生产中使用 uWSGI 已有一年多了 它似乎比 Gunicorn 处理所有事情都要好得多 随着我们的流量扩大 我试图更好地理解heroku的路由器和uWSGI之间的接口 以优化和防止问题 但它对我来说仍然相当不透明 我
  • 在Python中绘制像素的最佳方法[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想知道 用 x 和 y 值在 python 中绘制像素的最简单方法是什么 可能最简单的方法是使用PIL http effbot org i
  • 当下载线程之一终止时解锁 FIleStream

    我通过例如下载文件5 个线程 当其中一个线程完成下载文件部分时 它被中止 但所有其余线程都有 ThreadState WaitSleepJoin 并且显然停止下载 怎么解决呢 while bytesSize responseStream R
  • matplotlib 示例代码不适用于 python 虚拟环境

    我正在尝试在 matplotlib 中显示图像的 x y z 坐标 示例代码 http matplotlib org examples api image zcoord html在全局 python 安装上工作得很好 当我移动光标时 x y
  • 原子/易失性/同步之间有什么区别?

    原子 易失性 同步内部如何工作 下面的代码块有什么区别 Code 1 private int counter public int getNextUniqueIndex return counter Code 2 private Atomi
  • 缓存 pandas 数据框的最佳方法?

    昨天 我经历了惨痛的教训 将 pandas 数据帧保存到 csv 以供以后使用是一个坏主意 我有一个包含 130k 条推文的数据框 其中数据框的一行是list的推文 当我将数据保存到 CSV 然后重新加载数据帧时 数据帧的行现在是字符串类型
  • python 使用曲面图和第四个变量的滑块可视化 4d 数据

    如何使用前 3 个变量和第四个变量的 3 维曲面图作为滑块来可视化 4 维数据 从 csv 文件加载 集 我写了一个非常小的示例 重点介绍了实现此目标的方法 import numpy as np import matplotlib pypl
  • 在 SQLAlchemy 中删除父级后删除子级

    我的问题如下 我有两个型号Entry and Tag通过 SQLAlchemy 中的多对多关系链接 现在我想删除所有Tag没有任何对应的Entry后Entry被删除 示例来说明我想要的内容 Entry 1带标签python java Ent
  • Pygame - 两个圆圈的碰撞检测

    我正在制作一个碰撞检测程序 其中我的光标是一个半径为 20 的圆 当它碰到另一个圆时应该将值更改为 TRUE 出于测试目的 我在屏幕中心有一个半径为 50 的固定圆 我可以测试光标圆是否击中固定圆 但它不能正常工作 因为它实际上是在测试它是
  • 由 asyncio.new_event_loop 创建的事件循环挂起

    以下代码只是挂起而不打印任何内容 import asyncio async def foo loop print foo loop stop loop asyncio new event loop asyncio ensure future
  • PySpark:根据与另一列中的字符串匹配的字典值创建新列

    我有一个数据框 A 如下所示 ID SOME CODE TITLE 1 024df3 Large garden in New York New York 2 0ffw34 Small house in dark Detroit Michig
  • 如何在 python setup.py 中 chmod 文件?

    我使用 setup py 创建了一个 python 包安装 我希望它复制文件夹 为临时创建的 did 中的数据文件 问题是我必须使用 sudo 权限调用 setup py 因为它写入 usr local 因此 当我的数据文件复制到 did
  • 如何在(最好是纯)Python 中解码 QR 码图像?

    TL DR 我需要一种使用 最好是纯 Python 从图像文件中解码 QR 码的方法 我有一个带有 QR 码的 jpg 文件 我想使用 Python 对其进行解码 我发现有几个库声称可以做到这一点 PyQRCode 网站在这里 http p
  • 在 QThread.exit() 上立即停止处理事件队列

    我正在构建一个 Qt GUI 应用程序 它使用 QThread QObject 组合充当在主线程之外执行操作的工作人员 Via moveToThread QObject 被移动到 QThread 中 这样 我的工作线程就可以拥有在事件循环
  • 使用 Python 和 lxml 从 HTML 中删除类属性

    Question 如何使用 python 和 lxml 从 html 中删除类属性 Example I have p class DumbClass Lorem ipsum dolor sit amet consectetur adipis
  • Python:正则表达式 findall

    我使用 python 正则表达式从给定字符串中提取某些值 这是我的字符串 mystring txt sometext somemore text here some other text course course1 Id Name mar
  • Dash ImportError:无法从“werkzeug.debug.tbtools”导入名称“get_current_traceback”

    我正在尝试在 Pycharm 的 conda 环境中运行一个简单的破折号应用程序 但是我遇到了标题中的错误 奇怪的是 我在互联网上找不到提到这个错误的地方 除了here https community plotly com t dash w

随机推荐

  • Scala:列表中不同的foldRight实现

    我刚刚发现 scala 我在 2 12 上 提供了完全不同的实现向右折叠 for 不可变列表 and 可变列表 不可变列表 List scala override def foldRight B z B op A B gt B B reve
  • 自动调整大小蒙版如何工作?

    我找到了很多有关自动调整大小的信息 但没有一个能够解决我的问题 我有一个 ViewController RAViewController 它在 loadView 方法中调用视图 如下所示 void loadView Set Navigati
  • 为什么这个脚本不改变目录

    好吧 简单的 bash 脚本问题 别笑 我的脚本只是更改目录 echo on echo running script CURRENT DIR cd pwd 我可以看到它在 echo 中更改目录 但是当它完成时 我的终端仍然位于同一目录 有小
  • 如何在 android studio 3.5 中调整模拟器大小

    pic 1 https i stack imgur com k8r3n png我正在努力调整模拟器的大小 因为它太大了 我已经尝试了 stackoverflow 上的大部分技巧 但没有成功 这些帖子正在修复旧的 android studio
  • auto arima python 中的预测区间

    我想使用 python 中的 auto arima 计算 0 95 预测区间 我想获得预测的标准误差 就像我们可以在 R 中的统计预测中获得一样 然后我将使用公式 点预测 1 96 当时 t 预测的标准误差来获得上限和下限 我怎样才能在Py
  • 在SVN中,如何将一个目录的子目录复制到另一个目录?

    通过命令行 我通常这样做 cp rRp path to a folder path to another folder 这仅复制下面的内容a folder to 另一个文件夹 在 SVN 中我需要做同样的事情 但无法弄清楚 我总是这样结束
  • Codeigniter 将参数传递给控制器​​索引

    我正在使用 codeigniter 构建一个教程系统 并希望实现以下 URL 结构 tutorials gt 包含所有类别列表的介绍页面 tutorials a Category as string gt 这将给出给定类别的教程列表 例如
  • 无法导入“project-name-Swift.h”文件 xcode

    我有2个文件 代码注入 m import
  • 如何像解压经典元组一样解压元组结构?

    我可以像这样解压一个经典元组 let pair 1 true let one two pair 如果我有一个元组结构 例如struct Matrix f32 f32 f32 f32 我尝试解压它 收到有关 意外类型 的错误 struct M
  • 针对表中的每一行运行 SQL Server 函数

    我有一个函数可以迭代表中的 每一行 当它运行时 它应该查看每一行 提取该行的相关 SET 值并运行该函数 该函数依次返回结果并使用正确的值更新正确的行 发生的情况是 它正在运行并返回最后一行的值 并用该值更新所有行 有什么想法我做错了吗 S
  • 将数组传递给模板函数

    我正在尝试创建一个以数组作为参数的模板函数 该函数返回数组中数字的总和 这是我的代码 template
  • 适用于 F# 联合类型的简洁通用类型处理程序

    我在我的简洁对象上使用类似于枚举的联合类型 type Confidence Low Medium High type Goal Confidence Confidence 我创建了一个自定义类型处理程序以使其正常工作 type UnionH
  • 如何设置将在 Facebook 上显示为预览的网站图像?

    当您在 Facebook 上分享链接时 它会自动在网站上查找图像并随机选择一张作为预览 如何影响预览图像 当一个人在他的 Facebook 上分享网站链接时 1 将 Open Graph XML 命名空间扩展包含到您的 HTML 声明中 2
  • new Date() 设置错误的月份

    我想解析一个字符串 甚至是整数 新日期 函数 但看看会发生什么 date 2015 12 13 2015 12 13 date 2015 12 13 date2 new Date date Sat Dec 12 2015 19 00 00
  • 在移动浏览器上自动播放视频元素

    我读到自动播放是不可能的 或者不建议在 iOS 和 Android 上进行 更多信息请参见 移动设备 Android Chrome 和 Firefox 上的 iframe HTML5 播放器无法自动播放 https stackoverflo
  • 如何将 Java 依赖项添加到 Google Dataflow 项目?

    我的 Java 项目有很多来自第三方库的 jar 以及我自己的代码 如何部署这些以便 Google Cloud Dataflow 可以使用它们 有有关如何在 Python 中执行此操作的文档 https cloud google com d
  • 如何将 ENUM 值从视图转换为字符串到控制器

    所以我已经知道如何获取字符串 整数 十进制 现在我在枚举的这一部分中苦苦挣扎 如何将枚举转换为字符串 Enum statecode apsp Customer BillingAddress StateCode Value Customer
  • 最大化 iFrame(因此它看起来是请求页面)

    我如何 跨浏览器兼容 最大化 iFrame 以便它看起来是 URL 栏中的页面 即使它是从不同的服务器提供的 我想这应该可行
  • 正则表达式匹配 json 中的键

    我正在尝试匹配这种类型的 JSON 中的键 define key1 some text and more key2 some text key3 more some text key4 some text 用这个正则表达式 lt s s w
  • python 多线程比顺序代码更快...为什么?

    在许多有关 python 多线程的堆栈溢出问答中 我读到 python 有 GIL 因此多线程比顺序代码慢 但在我的代码中它看起来并不像 这是多线程代码 代码已更新2023年2月21日 import threading import tim