为嵌套 for 循环最大化 CPU 使用率的最简单方法是什么?

巴特范伯克尔

我有代码可以进行元素的独特组合。有6种,每种大约有100种。所以有 100^6 种组合。必须计算每个组合,检查相关性,然后丢弃或保存。

代码的相关部分如下所示:

def modconffactory():
for transmitter in totaltransmitterdict.values():
    for reciever in totalrecieverdict.values():
        for processor in totalprocessordict.values():
            for holoarray in totalholoarraydict.values():
                for databus in totaldatabusdict.values():
                    for multiplexer in totalmultiplexerdict.values():
                        newconfiguration = [transmitter, reciever, processor, holoarray, databus, multiplexer]
                        data_I_need = dosomethingwith(newconfiguration)
                        saveforlateruse_if_useful(data_I_need)

现在这需要很长时间,这很好,但现在我意识到这个过程(进行配置,然后计算供以后使用)一次只使用我的 8 个处理器内核中的 1 个。

我一直在阅读有关多线程和多处理的内容,但我只看到了不同进程的示例,而不是如何对一个进程进行多线程处理。在我的代码中,我调用了两个函数:“dosomethingwith()”和“saveforlateruse_if_useful()”。我可以将它们分成单独的进程,并让它们同时运行到 for 循环,对吗?

但是 for 循环本身呢?我可以加快这一进程吗?因为那是时间消耗的地方。(<-- 这是我的主要问题)

有骗子吗?例如编译为C,然后自动编译为os 多线程?

安德鲁·车

我只看到不同进程的例子,而不是如何多线程一个进程

Python中有多线程,但是因为GIL(Global Interpreter Lock),效率很低。所以如果你想使用你所有的处理器内核,如果你想要并发,你别无选择,只能使用多个进程,这可以用multiprocessing模块来完成(好吧,你也可以使用另一种语言而没有这样的问题)

适用于您的案例的多处理使用的近似示例:

import multiprocessing

WORKERS_NUMBER = 8

def modconffactoryProcess(generator, step, offset, conn):
    """
    Function to be invoked by every worker process.

    generator: iterable object, the very top one of all you are iterating over, 
    in your case, totalrecieverdict.values()

    We are passing a whole iterable object to every worker, they all will iterate 
    over it. To ensure they will not waste time by doing the same things 
    concurrently, we will assume this: each worker will process only each stepTH 
    item, starting with offsetTH one. step must be equal to the WORKERS_NUMBER, 
    and offset must be a unique number for each worker, varying from 0 to 
    WORKERS_NUMBER - 1

    conn: a multiprocessing.Connection object, allowing the worker to communicate 
    with the main process
    """
    for i, transmitter in enumerate(generator):
        if i % step == offset:
            for reciever in totalrecieverdict.values():
                for processor in totalprocessordict.values():
                    for holoarray in totalholoarraydict.values():
                        for databus in totaldatabusdict.values():
                            for multiplexer in totalmultiplexerdict.values():
                                newconfiguration = [transmitter, reciever, processor, holoarray, databus, multiplexer]
                                data_I_need = dosomethingwith(newconfiguration)
                                saveforlateruse_if_useful(data_I_need)
    conn.send('done')


def modconffactory():
    """
    Function to launch all the worker processes and wait until they all complete 
    their tasks
    """
    processes = []
    generator = totaltransmitterdict.values()
    for i in range(WORKERS_NUMBER):
        conn, childConn = multiprocessing.Pipe()
        process = multiprocessing.Process(target=modconffactoryProcess, args=(generator, WORKERS_NUMBER, i, childConn))
        process.start()
        processes.append((process, conn))
    # Here we have created, started and saved to a list all the worker processes
    working = True
    finishedProcessesNumber = 0
    try:
        while working:
            for process, conn in processes:
                if conn.poll():  # Check if any messages have arrived from a worker
                    message = conn.recv()
                    if message == 'done':
                        finishedProcessesNumber += 1
            if finishedProcessesNumber == WORKERS_NUMBER:
                working = False
    except KeyboardInterrupt:
        print('Aborted')

您可以WORKERS_NUMBER根据自己的需要进行调整

multiprocessing.Pool

import multiprocessing

WORKERS_NUMBER = 8

def modconffactoryProcess(transmitter):
    for reciever in totalrecieverdict.values():
        for processor in totalprocessordict.values():
            for holoarray in totalholoarraydict.values():
                for databus in totaldatabusdict.values():
                    for multiplexer in totalmultiplexerdict.values():
                        newconfiguration = [transmitter, reciever, processor, holoarray, databus, multiplexer]
                        data_I_need = dosomethingwith(newconfiguration)
                        saveforlateruse_if_useful(data_I_need)


def modconffactory():
    pool = multiprocessing.Pool(WORKERS_NUMBER)
    pool.map(modconffactoryProcess, totaltransmitterdict.values())

你可能想用.map_async而不是.map

两个片段的作用相同,但我想说在第一个片段中,您对程序有更多的控制权。

我想第二个是最简单的,不过:)

但是第一个应该让你知道第二个发生了什么

multiprocessing文档:https : //docs.python.org/3/library/multiprocessing.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CPU使用率未最大化,并且服务器应用程序依赖异步/等待机制的高度同步

来自分类Dev

如何编写一个最大化物理RAM使用率的程序?

来自分类Dev

将并行for循环作为低优先级CPU操作执行的最简单方法是什么?

来自分类Dev

最大CPU使用率(允许的最大CPU使用率)

来自分类Dev

紧密循环-磁盘使用率为100%,四核CPU @ 25%的使用率,磁盘写入速度仅为15MBsec

来自分类Dev

如何使用GLUT最大化窗口

来自分类Dev

模拟最大CPU负载的最简单方法?

来自分类Dev

浮点最大化循环不会在D中终止,可以在C ++中使用

来自分类Dev

使用Powershell最大化Lync Window?

来自分类Dev

如何在Elasticsearch集群上最大化CPU核心

来自分类Dev

无法使用JavaFX最大化窗口

来自分类Dev

LAMP / Laravel-报告生成最大化单个CPU

来自分类Dev

如何使用Unity为最大化的窗口按钮设置主题?

来自分类Dev

嵌套最大化与在R中使用全局变量的需求并行

来自分类Dev

如何从R(带有Keras库)中最大化Tensorflow 2.0的GPU使用率?

来自分类Dev

如何在不最大化CPU使用率的情况下显示大量GMSPolylines?

来自分类Dev

CPU使用率未最大化,并且依赖异步/等待的服务器应用程序中的高度同步

来自分类Dev

如何使用Unity为最大化的窗口按钮设置主题?

来自分类Dev

当Windows任务管理器中的CPU使用率为0%时,这实际上是什么意思?

来自分类Dev

为什么“ top”命令显示的CPU使用率为799%?

来自分类Dev

CPU使用率为25%时的随机进程

来自分类Dev

嵌套为单行的嵌套for循环是什么意思?- Python

来自分类Dev

使用相同按钮的Javascript最大化/取消最大化窗口

来自分类Dev

如何使用GLUT最大化窗口

来自分类Dev

为什么我的CPU经常会以32%的速度最大化?

来自分类Dev

使用Powershell最大化Lync Window?

来自分类Dev

在PC上/在VLC中播放4k hdr视频可最大化CPU而不是使用GPU

来自分类Dev

你如何使用 CSS 为我的网站制作最小化、最大化和关闭按钮

来自分类Dev

为最大化的窗口设置最大大小

Related 相关文章

  1. 1

    CPU使用率未最大化,并且服务器应用程序依赖异步/等待机制的高度同步

  2. 2

    如何编写一个最大化物理RAM使用率的程序?

  3. 3

    将并行for循环作为低优先级CPU操作执行的最简单方法是什么?

  4. 4

    最大CPU使用率(允许的最大CPU使用率)

  5. 5

    紧密循环-磁盘使用率为100%,四核CPU @ 25%的使用率,磁盘写入速度仅为15MBsec

  6. 6

    如何使用GLUT最大化窗口

  7. 7

    模拟最大CPU负载的最简单方法?

  8. 8

    浮点最大化循环不会在D中终止,可以在C ++中使用

  9. 9

    使用Powershell最大化Lync Window?

  10. 10

    如何在Elasticsearch集群上最大化CPU核心

  11. 11

    无法使用JavaFX最大化窗口

  12. 12

    LAMP / Laravel-报告生成最大化单个CPU

  13. 13

    如何使用Unity为最大化的窗口按钮设置主题?

  14. 14

    嵌套最大化与在R中使用全局变量的需求并行

  15. 15

    如何从R(带有Keras库)中最大化Tensorflow 2.0的GPU使用率?

  16. 16

    如何在不最大化CPU使用率的情况下显示大量GMSPolylines?

  17. 17

    CPU使用率未最大化,并且依赖异步/等待的服务器应用程序中的高度同步

  18. 18

    如何使用Unity为最大化的窗口按钮设置主题?

  19. 19

    当Windows任务管理器中的CPU使用率为0%时,这实际上是什么意思?

  20. 20

    为什么“ top”命令显示的CPU使用率为799%?

  21. 21

    CPU使用率为25%时的随机进程

  22. 22

    嵌套为单行的嵌套for循环是什么意思?- Python

  23. 23

    使用相同按钮的Javascript最大化/取消最大化窗口

  24. 24

    如何使用GLUT最大化窗口

  25. 25

    为什么我的CPU经常会以32%的速度最大化?

  26. 26

    使用Powershell最大化Lync Window?

  27. 27

    在PC上/在VLC中播放4k hdr视频可最大化CPU而不是使用GPU

  28. 28

    你如何使用 CSS 为我的网站制作最小化、最大化和关闭按钮

  29. 29

    为最大化的窗口设置最大大小

热门标签

归档