Python 3.x I/O或CPU绑定?如何检查是否同时运行?

Python 3.x I/O或CPU绑定?如何检查是否同时运行?,python-3.x,python-multiprocessing,python-multithreading,Python 3.x,Python Multiprocessing,Python Multithreading,我是Python新手,我正在努力理解多处理/线程中的一些事情。我想加快一个函数的速度,并且一直在尝试与多处理模块不同的方法,但我无法让它运行得更快。它可能不会运行得更快,但我想在放弃之前确定这是真的。这不是一个完整的描述,但最耗时的活动是: -重复生成随机数据(10000行10列) -使用预拟合模型预测每行和每行的结果 -将每个预测值与初始值进行比较 它根据预测值中有多少等于初始值执行多次,每次更新分布参数。函数的输出是单个数值 我想循环几个初始值,最后得到一个输出值列表。我希望多个迭代同时运行

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

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

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

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

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

我想循环几个初始值,最后得到一个输出值列表。我希望多个迭代同时运行(但我愿意接受任何可以加快运行速度的方法)。我一直在无知地尝试pool.apply、starmap和Process,但没有看到时间上的变化

我的问题是:

  • 根据我所做的描述,我的程序是I/O还是CPU受限?(有没有可能从中分辨出来?这个问题问得对吗?)

  • 我应该使用多线程还是多处理

  • 如何确定迭代是否同时运行


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

    我可能会看看python,因为创建数据的循环,可能是。您只需要所有线程同时运行rand函数

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

    示例:我编写了一个快速示例来帮助使用线程池。在我的i7上,你的10列10000项列表甚至不引人注目。我将列数增加到10000,它使用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(),它似乎只使用了一半的内核,没有达到最大值。使用来自多处理的过程使所有人都参与其中,但同样,没有达到最大。我应该更关心尝试在迭代中使用线程来生成随机数,而不是让迭代本身同时运行吗?我可以两者都做吗?您是否将池大小设置为最大可用线程数?例如,如果您有4个内核和超线程,那么应该使用8个进程(
    Pool(8)
    )。尽管如此,文件说不指定应该给你正确的大小。