Python 对于这个操作,多处理是一个好的解决方案吗?

Python 对于这个操作,多处理是一个好的解决方案吗?,python,numpy,multiprocessing,Python,Numpy,Multiprocessing,“Number”其他列表和其他数组中的元素数可以单独计算。 然而,由于程序是依赖于时间的,在处理每个“数量”的元素之前,我们不能进行进一步的工作 对于这个操作,多处理是一个好的解决方案吗? 我应该最大限度地加快这个过程。 如果更好,请建议代码。但您不应该这样做 阅读和阅读 在不知道阵列的具体计算或大小的情况下,以下是通用指南,没有特定顺序: 衡量代码的性能。找到热点。代码加载输入数据的时间可能比所有计算时间都长。设定你的目标,定义哪些权衡是可以接受的 通过自动化测试检查您是否获得了预期的结果 检

“Number”其他列表和其他数组中的元素数可以单独计算。 然而,由于程序是依赖于时间的,在处理每个“数量”的元素之前,我们不能进行进一步的工作

对于这个操作,多处理是一个好的解决方案吗? 我应该最大限度地加快这个过程。 如果更好,请建议代码。

但您不应该这样做

阅读和阅读

在不知道阵列的具体计算或大小的情况下,以下是通用指南,没有特定顺序:

衡量代码的性能。找到热点。代码加载输入数据的时间可能比所有计算时间都长。设定你的目标,定义哪些权衡是可以接受的 通过自动化测试检查您是否获得了预期的结果 检查是否可以使用优化的库来解决问题 确保算法具有足够的时间复杂度。对于较大的n,纯Python中的On算法可以比C中的On**2算法更快 使用切片和矢量化的自动循环计算来替换仅Python解决方案中的显式循环。 使用weave、f2py、cython或类似工具重写需要优化的地方。提供类型信息。探索编译器选项。决定是否值得加速以保持C扩展。 尽量减少分配和数据复制。使其缓存友好。 探索多线程在您的情况下是否有用,例如cython.parallel.prange。释放吉尔。 与多处理方法相比。上面的链接包含一个如何并行计算数组的不同切片的示例。 迭代 但你现在还不应该这么做

阅读和阅读

在不知道阵列的具体计算或大小的情况下,以下是通用指南,没有特定顺序:

衡量代码的性能。找到热点。代码加载输入数据的时间可能比所有计算时间都长。设定你的目标,定义哪些权衡是可以接受的 通过自动化测试检查您是否获得了预期的结果 检查是否可以使用优化的库来解决问题 确保算法具有足够的时间复杂度。对于较大的n,纯Python中的On算法可以比C中的On**2算法更快 使用切片和矢量化的自动循环计算来替换仅Python解决方案中的显式循环。 使用weave、f2py、cython或类似工具重写需要优化的地方。提供类型信息。探索编译器选项。决定是否值得加速以保持C扩展。 尽量减少分配和数据复制。使其缓存友好。 探索多线程在您的情况下是否有用,例如cython.parallel.prange。释放吉尔。 与多处理方法相比。上面的链接包含一个如何并行计算数组的不同切片的示例。 迭代 因为这里有一个while-True子句,所以我假设您将运行大量迭代,因此潜在的收益最终将超过多处理池生成带来的减速。出于显而易见的原因,我还假设您的机器上有多个逻辑核。然后问题就变成了,序列化输入和反序列化结果的成本是否会被收益抵消

根据我的经验,知道是否有什么可以获得的最好方法就是尝试一下。我建议:

您可以在开始时传递任何常量输入。因此,如果数组_1、数组_2和数组_3中的任何一个从未更改,则在调用进程时将其作为参数传递。这样可以减少需要通过IPC拾取和传递的数据量,而IPC正是多处理所做的 您可以使用工作队列,并在任务可用时立即向其添加任务。通过这种方式,您可以确保在流程完成任务时总是有更多的工作等待。 因为这里有一个while-True子句,所以我假设您将运行大量迭代,因此潜在的收益最终将超过多处理池生成带来的减速。出于显而易见的原因,我还假设您的机器上有多个逻辑核。然后问题就变成了,序列化输入和反序列化结果的成本是否会被收益抵消

根据我的经验,知道是否有什么可以获得的最好方法就是尝试一下。我建议:

您可以在开始时传递任何常量输入。因此,如果数组_1、数组_2和数组_3中的任何一个从未更改,则在调用进程时将其作为参数传递。这样可以减少需要通过IPC拾取和传递的数据量,而IPC正是多处理所做的 您可以使用工作队列,并在任务可用时立即向其添加任务。通过这种方式,您可以确保在流程完成任务时总是有更多的工作等待。
你有没有太慢的工作代码?您分析过它吗?lenNumber将失败,因为您无法获取数字的长度。数组[None]*数字似乎是slo
w是一种创建数组的方法,因为它首先创建一个大小相等的Python列表。也许您应该使用空或零来创建数组。此外,单个计算有多复杂?如果执行单个计算的时间超过生成子流程、向子流程分发数据和收集结果所需的时间,则多处理将是一个很好的解决方案。它假设多个处理器可以并行运行——在一个处理器上运行多个进程没有意义。除非计算时间大大超过每个进程的开销,否则多处理不会有多大帮助。总是先转换为字符串,然后再计算长度。LenstrNumber您是否有运行速度太慢的代码?您分析过它吗?lenNumber将失败,因为您无法获取数字的长度。array[None]*Number似乎是一种创建数组的慢方法,因为它首先创建一个大小相等的Python列表。也许您应该使用空或零来创建数组。此外,单个计算有多复杂?如果执行单个计算的时间超过生成子流程、向子流程分发数据和收集结果所需的时间,则多处理将是一个很好的解决方案。它假设多个处理器可以并行运行——在一个处理器上运行多个进程没有意义。除非计算时间大大超过每个进程的开销,否则多处理不会有多大帮助。总是先转换为字符串,然后再计算长度。Lenstrnumber是个好建议!实际上,可以很好地将numpy数组与多处理结合使用。我总是这样做。你只需要知道最简单的方法不是使用共享内存。多处理将允许您对它们进行pickle处理,并将它们发送回与任何其他python对象类似的位置。显然,这有很高的开销,并且会复制每个块,因此在相对较大的块中工作是违反直觉的。这取决于问题,但在某些情况下,您可以使用相当直接的多处理方法获得非常好的加速。在某些情况下,pool+numpy方法。尽管如此,我同意,多处理可能不适合OP的问题,最好用其他方法进行优化。好建议!实际上,可以很好地将numpy数组与多处理结合使用。我总是这样做。你只需要知道最简单的方法不是使用共享内存。多处理将允许您对它们进行pickle处理,并将它们发送回与任何其他python对象类似的位置。显然,这有很高的开销,并且会复制每个块,因此在相对较大的块中工作是违反直觉的。这取决于问题,但在某些情况下,使用相当直接的多处理方法可以获得非常好的加速。在某些情况下,pool+numpy方法。尽管如此,我同意,多处理可能不适合OP的问题,最好用其他方法进行优化。
while True:

    Number = len(SomeList)

    OtherList = array([None]*Number)

    for i in xrange(Number):
        OtherList[i] = (Numpy Array Calculation only using i_th element of arrays, Array_1, Array_2, and Array_3.)