使用Python的线程模块调用ctypes函数比使用多处理更快?

2024-05-24

我一生都无法找出这个问题的答案。

我编写了一个可以执行数百次繁重计算的脚本。我有一个绝妙的主意,将这些计算任务编写为 C++,然后使用 Python 的 ctypes 与它们交互。

我心想,我什至可以使用并行性进一步优化它。我最初的方法是使用线程。然后我意识到我的任务是受 CPU 限制的。因此,我们使用多处理才有意义。事实证明,多处理模块比线程慢得多,可能是由于开销所致。

然后我遇到了this http://caswenson.com/2009_06_13_bypassing_the_python_gil_with_ctypes.html。对于那些不想点击粗略链接的人来说,事实证明 ctypes 模块绕过了 GIL。这意味着我对Python线程的尝试可以实现真正的并行。

所以我的问题是:官方文档中有关于 ctypes 和 GIL 的地方吗?

我已附上用于对线程+ ctypes 和多处理进行基准测试的代码。

# Method 1: Using threading
start = time()

threads = []
for arg in args:
    threads.append(threading.Thread(target=some_ctypes_func, args=(arg, )))

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

print(f"Elapsed time: {time() - start}")

# Method 2: Using multiprocessing
results = []
with Pool(8) as p:
    start = time()
    for arg in args:
        result = p.apply_async(some_ctypes_func, args=(arg,))
        results.append(result)

    results = [result.get() for result in results]
    print(f"Elapsed time: {time() - start}")

使用上面的代码,线程模块比多处理快大约 2 到 3 倍。


None

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

使用Python的线程模块调用ctypes函数比使用多处理更快? 的相关文章

随机推荐

  • Chrome + 另一个进程:进程间通信比 HTTP/XHR 请求更快?

    我有一个进程 1 对视频流进行实时图像处理 我需要在 Chrome 中的 HTML 页面中渲染该视频 同一台计算机上的进程 2 在canvas or img or videoHTML5 元素 由于我有 1000x1000 像素 x 3 字节
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • 稍微不同的形状会收敛到错误的数字 - 为什么?

    我试图弄清楚为什么 TensorFlow 会做一些令人惊讶的事情 我将其归结为一个测试用例 尝试对一个简单的问题进行线性回归 该问题只需将两个输入加在一起 权重收敛到 1 0 偏差收敛到 0 0 正如它们应该的那样 使用此版本的训练输出 t
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 可以使用drawable-mdpi-fr、drawable-hdpi-fr、drawable-ldpi-fr进行不同分辨率的本地化

    我想对不同的本地化使用不同的图像 但是 我有所有分辨率和所有语言的图像 有什么办法可以做到这一点吗 是的 这是可能的 可绘制 de rDE ldpi 可绘制 de rDE mdpi 核实
  • Angular Service Worker - 无法加载资源:服务器响应状态为 504(网关超时)

    我正在使用Angular CLI 1 6 6 and angular service worker 5 2 5 in our Angular 5 2 5应用程序 除了在我们的生产环境中弹出一条错误消息之外 本地精简版服务器以及生产服务器上的
  • 如何从公共函数返回变量

    我试图摆脱在主时间线上使用代码 但我很难理解 as 文件和 fla 文件如何交互 例如 我试图弄清楚如何将变量从主时间线传递到公共函数 对该变量执行一些操作并将其传递回主时间线 我在框架上有一个输入文本框和一个带有侦听器的简单按钮 我希望能
  • 通过均匀分布值来有效合并两个数组

    我见过许多问题 答案主题是通过交替值合并两个数组 他们是这样工作的 let array1 a b c d let array2 1 2 let outcome a 1 b 2 c d 但我希望输出更加高效 并且根据数组大小均匀分配值 exp
  • 如何从线性模型 (lm) 预测 x 值

    我有这个数据集 x lt c 0 40 80 120 160 200 y lt c 6 52 5 10 4 43 3 99 3 75 3 60 我使用计算了一个线性模型lm model lt lm y x 我想知道的预测值x如果我有新的y值
  • 指定枚举类型

    有枚举 enum Foo Bar should cause type error Baz Baz 可以为其指定类型以使其成为仅字符串枚举吗 如果您愿意 您可以执行以下操作 创建一个函数 要求其输入只有string 有价值的属性 const
  • 在另一个布局中以编程方式膨胀布局

    我的 Android 应用程序需要帮助 我需要在另一个布局中膨胀一个布局 但我不知道该怎么做 我的xml代码是这样的 item xml 我需要膨胀多个 xml 取决于可变数量
  • 将字典写入 csv 时遇到问题,其中键作为标题,值作为列

    我有一本字典 看起来像 mydict foo 1 2 bar 3 4 asdf 5 6 我正在尝试将其写入 CSV 文件 使其看起来像 foo bar asdf 1 3 5 2 4 6 我花了最后一个小时寻找解决方案 我发现的最接近的解决方
  • 如何在 ssis 包 2016 中捕获毫秒时间戳

    如何在 ssis 包 2016 中捕获当前时间戳 我声明了一个变量并使用表达式 但缺少毫秒 currenttimestamp DT WSTR 50 DT DBTIMESTAMP System StartTime 我也想要毫秒 Thanks
  • 添加istio出口网关后,Pod无法curl外部网站

    我正在关注 Istio 文档 https istio io docs examples advanced egress egress gateway https istio io docs examples advanced egress
  • 导轨中的多个 DB 连接

    我正在尝试在 ROR 应用程序中连接多个数据库 我的 database yml 如下所示 在你的database yml文件中 发展 adapter mysql username root password database example
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 用于在某个日期或活动打开 iCal 应用程序的 URL 方案?

    Apple URL 方案参考 https developer apple com library ios featuredarticles iPhoneURLScheme Reference Introduction Introductio
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • 使用Python的线程模块调用ctypes函数比使用多处理更快?

    我一生都无法找出这个问题的答案 我编写了一个可以执行数百次繁重计算的脚本 我有一个绝妙的主意 将这些计算任务编写为 C 然后使用 Python 的 ctypes 与它们交互 我心想 我什至可以使用并行性进一步优化它 我最初的方法是使用线程