同时处理数字数组的python多处理

同时处理数字数组的python多处理,python,multithreading,python-3.x,python-multiprocessing,Python,Multithreading,Python 3.x,Python Multiprocessing,我有一张号码表: a=[1,2,3,4,5,.....2000] 我必须对每个数字进行平方运算并更新相同的数组,但我不想编写循环,而是想使用并行处理来完成 因此,对数组中的每个数字进行平方运算本身就是一个过程 Expected output=[1,3,9,16,25,........] 如何使用python多处理库实现这一点 已尝试使用线程库,但代码速度不够快,加上线程库未使用所有内核。您可以使用多处理模块中的池类 from multiprocessing import Pool def

我有一张号码表:

a=[1,2,3,4,5,.....2000]
我必须对每个数字进行平方运算并更新相同的数组,但我不想编写循环,而是想使用并行处理来完成

因此,对数组中的每个数字进行平方运算本身就是一个过程

Expected output=[1,3,9,16,25,........]
如何使用python多处理库实现这一点


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

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

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

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]

在这种情况下,numpy将非常方便,因为它使用矩阵方法进行计算。下面是一段代码,可用于此目的。如果您想并行它,您可以使用前面提到的Pool函数

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

在这种情况下,numpy将非常方便,因为它使用矩阵方法进行计算。下面是一段代码,可用于此目的。如果您想并行它,您可以使用前面提到的Pool函数

import numpy as np
def Square(data):
    data_np = np.array(data) ** 2
    print (data_np)
Square([1, 2, 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))
您可以在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))

Pool(5)表示cpu中有5个内核??我遇到了一个非常奇怪的错误:TypeError:无法序列化“_io.TextIOWrapper”对象…我正在从json文件读取数组…可能的解决方案:不,等等,我解决了我的问题:def f(x,power):return pow(x,power)我如何将电源传递给函数f?Pool(5)指示cpu中有5个内核??我得到了一个非常奇怪的错误:TypeError:无法序列化'\u io.TextIOWrapper'对象…我正在从json文件读取数组…可能的解决方案:不,等等,我解决了它我的问题是:def f(x,power):return pow(x,power)如何将电源传递给函数f?如果您能够/愿意使用
numpy
,那么您可以比我想象的多处理更快地完成此任务。另外,在最后一点上,线程无法提高此任务的速度。由于全局解释器锁(GIL),一次只能有一个线程执行其代码。线程只是给人一种并发的假象。多个进程不受GIL的约束,只有多线程是有效的@roganjosh@101我从来没有说过多处理是受GIL约束的(尽管每个子进程都是如此)。我的评论特别指出,为了回答问题的最后一句话…numpy只让你执行数值计算,对吗?…我不能对数组上的字符串或类似的东西进行模式匹配…?如果你能够/愿意使用
numpy
,那么你可以比我想象的多处理速度快得多。还有最后一点,线程化无法提高此任务的速度。由于全局解释器锁(GIL),一次只能有一个线程执行其代码。线程只是给人一种并发的假象。多个进程不受GIL的约束,只有多线程是有效的@roganjosh@101我从来没有说过多处理是受GIL约束的(尽管每个子进程都是如此)。我的评论特别提到了线程化,以解决问题的最后一句话…numpy only让我们来执行数值计算,对吗?…我不能对数组上的字符串或类似的东西进行模式匹配。。?