【问题标题】:python multiprocessing handling an array of numbers concurrentlypython多处理同时处理一个数字数组
【发布时间】:2017-07-28 06:04:30
【问题描述】:

我有一个号码列表:

a=[1,2,3,4,5,.....2000]

我必须对每个数字求平方并更新相同的数组,但我不想编写循环,而是想使用并行处理来完成。

因此,对数组中的每个数字求平方本身就是一个过程。

Expected output=[1,3,9,16,25,........]

如何使用 python 多处理库实现这一点?

已经尝试使用线程库,但代码速度不够快,加上线程库没有使用所有内核。

【问题讨论】:

  • 如果您能够/愿意使用numpy,那么您可以比我想象的多处理更快地做到这一点。
  • 最后一点,线程不能提高这个任务的速度。由于全局解释器锁 (GIL),任何时候只有一个线程可以执行其代码。线程只会给人一种并发的错觉。
  • 多个进程不受GIL约束,只有多线程是@roganjosh
  • @101 我从来没有说过多处理受 GIL 的约束(尽管每个子进程都是)。我的评论特别提到线程,以解决问题的最后一句话......
  • numpy 只让你执行数值计算,对吗?...我不能对数组上的字符串或类似的东西进行一些模式匹配..?

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


【解决方案1】:

您可以使用多处理模块中的Pool

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(5)
    print(p.map(f, [1, 2, 3]))

#prints [1, 4, 9]

【讨论】:

  • Pool(5) 表示cpu中有5个核心??
  • 我遇到了一个非常奇怪的错误:TypeError: cannot serialize '_io.TextIOWrapper' object ...我正在从 json 文件中读取数组...
  • 不等我解决了我的问题是:def f(x,power): return pow(x,power) 我如何将权力传递给函数 f?
【解决方案2】:

在这个 numpy 中会很方便,因为它适用于 Matrix 方法来计算。这是可以达到目的的一段代码。如果你想并行它,你可以使用所述的 Pool 函数

import numpy as np
def Square(data):
    data_np = np.array(data) ** 2
    print (data_np)
Square([1, 2, 3])

【讨论】:

    【解决方案3】:

    您可以在 concurrent.futures 模块中尝试 ProcessPoolExecutor。示例代码:

    from time import time
    from concurrent.futures import ProcessPoolExecutor
    
    
    def gcd(pair):
        a, b = pair
        low = min(a, b)
        for i in range(low, 0, -1):
            if a % i == 0 and b % i == 0:
                return i
    
    
    numbers = [(1963309, 2265973), (2030677, 3814172),
               (1551645,    2229620),   (2039045,   2020802)]
    start = time()
    results = list(map(gcd, numbers))
    end = time()
    print('1st Took %.3f seconds' % (end - start))
    start = time()
    pool = ProcessPoolExecutor(max_workers=2)
    results = list(pool.map(gcd, numbers))
    end = time()
    print('2nd Took %.3f seconds' % (end - start))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2017-05-27
      相关资源
      最近更新 更多