【问题标题】:I/O or CPU bound? How to check if running concurrently?I/O 或 CPU 受限?如何检查是否同时运行?
【发布时间】:2019-09-25 15:28:12
【问题描述】:

我是 Python 新手,我很难理解多处理/线程中的一些东西。我想加速一个函数,并一直在尝试与多处理模块不同的方法,但我无法让它运行得更快。它可能不会运行得更快,但我想在放弃之前确定是这种情况。这不是完整的描述,但最耗时的活动是:

-重复生成随机数据(10000行10列)

-使用预拟合模型来预测每一行的结果和

- 将每个预测值与初始值进行比较。

根据预测值中有多少等于初始值,它会执行多次,每次更新分布的参数。函数的输出是单个数值。

我想遍历其中的几个初始值并最终得到一个输出值列表。我希望让多个迭代同时运行(但我愿意接受任何可以让它更快的方法)。我一直在无知地尝试 pool.apply、starmap 和 Process,但没有及时看到变化。

我的问题是:

  1. 根据我在做什么的描述,我的程序 I/O 或 CPU 是否受限? (有没有可能从中看出?这甚至是正确的问题吗?)

  2. 我应该使用多线程还是多处理?

  3. 如何确定迭代是否同时运行?

【问题讨论】:

    标签: python-3.x python-multiprocessing python-multithreading


    【解决方案1】:

    鉴于您没有提及有关驱动器的任何内容,我将假设它不受 IO 限制(尽管仍有可能)。您是否正在使用多个线程/进程?如果不是,那肯定是你的问题。

    我可能会查看 Pythons Thread library,并且由于创建数据的循环,可能是 thread pool library。您只需要同时运行该 rand 函数的所有线程。

    编辑:我忘了提。如果您打开任务管理器/系统监视器,您应该能够看到每个 CPU/线程的负载。如果在任何给定时间只有一个被最大化,你就不是并发的。

    示例:我写了一个快速示例来帮助处理线程池。在我的 i7 上,您的 10,000 项 10 列项目列表甚至都不明显。我将列增加到 10,000 列,它使用了 4GB 的 RAM 和 30 秒的 100% CPU @ 3.4GHz。

    from multiprocessing import Pool, Array
    import random
    
    
    def thread_function(_):
        """Return a random number."""
        l = []
        for _ in range(10000):
            l.append(random.randint(0, 10000))
        return l
    
    if __name__ == '__main__':
        rand_list = Array('i', range(10000))
    
        with Pool() as pool:
            rand_list = pool.map(thread_function, rand_list)
        print(len(rand_list))
    

    【讨论】:

    • 感谢您的回复。我使用了 ThreadPool(),它似乎只使用了一半的内核并且没有被最大化。使用多处理中的 Process 使所有这些都参与进来,但同样没有达到极限。我是否应该更关心尝试在迭代中使用线程来生成随机数,而不是让迭代本身同时运行?我可以两者都做吗?
    • 您是否将池大小设置为最大可用线程?例如,如果您有 4 个内核和超线程,您应该使用 8 个进程 (Pool(8))。虽然,文档说不指定应该给你正确的大小。
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多