gpt4 book ai didi

python - 使用生成器在 python 中线程化

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:18 25 4
gpt4 key购买 nike

我正在创建一种算法,该算法使用生成器对象来强力搜索 3x3 矩阵的条件以创建所有可能的组合。目前,在单个线程上运行它所需的时间会花费大量时间,但是我可以访问具有多个内核(64)的计算机,因此将其线程化为至少具有 20 个线程将是非常可行的选项。

但是,我不能简单地将生成器对象转换为列表并将列表拆分为大小相等的 block 。存储列表列表所需的 RAM 量太大。

我的单线程方法(针对问题进行了简化)如下:

def permute(xs, low=0):
if low + 1 >= len(xs):
yield xs
else:
for p in permute(xs, low + 1):
yield p
for i in range(low + 1, len(xs)):
xs[low], xs[i] = xs[i], xs[low]
for p in permute(xs, low + 1):
yield p
xs[low], xs[i] = xs[i], xs[low]

generator_obj = permute(range(9))
for l in generator_obj:
search_conditions(l)

什么是对此进行线程化的好方法?

最佳答案

  1. 即使您有多个线程,它们仍然会在同一个进程中,该进程只会在单个内核上执行。

  2. 与其将数据分成固定数量的相等 block ,不如动态创建一组批处理?例如,您可以

    • 使用生成器创建一个要处理的项目列表,该列表足够小以避免填满 RAM 的任何危险,
    • 使用以下建议: https://stackoverflow.com/a/1269055/3366796
    • 或使用picklemsgpack 或数据库将列表列表保存到磁盘
    • 然后,使用单独的脚本,使用subprocess.Popen 处理每个批处理并将结果写回磁盘
    • 等待流程完成,然后让另一个例程汇总结果

此方法将利用多核系统的强大功能,但应考虑确保磁盘不会成为瓶颈。

编辑:我会试试这个 -> http://www.dabeaz.com/coroutines/coprocess.py

关于python - 使用生成器在 python 中线程化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34296698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com