【问题标题】:Combining python's multiprocessing module with a prime number function将python的多处理模块与素数函数相结合
【发布时间】:2017-11-15 23:12:23
【问题描述】:

我正在使用 python 多处理/池模块来比较检查数字是否为素数的函数的程序运行时间。我可以让主要功能自行工作,但似乎无法将两者合并,以便它们一起工作。池函数如下:

import math import time
import multiprocessing from multiprocessing import Pool

def pool_process(f,data,pool_size):

    tp1 = time.time()
    pool = Pool(processes = pool_size)
    result = pool.map(f, data)
    pool.close()
    pool.join()
    #enter code here
    print("Results", result)
    print("Overall Time:", (time.time()-tp1))

我用来检查一个数是否为素数的函数如下:

def check_prime(num):

    t1 = time.time()
    res = False

    if num > 0:

        for i in range(2,num):
            if (num % i) == 0:
                print(num,"is not a prime number")
                print(i,"times",num//i,"is",num)
                print("Time:", (time.time()-t1))
                break
        else:
            print(num,"is a prime number")
            print("Time:", time.time()-t1) 
            res = True

    return res

然后我调用 pool_process 函数

data = 15488801
pool_process(check_prime, data, 1)

我收到以下错误:

'int' object is not iterable

【问题讨论】:

  • 什么是def pool_process(f,data,pool_size),为什么它会出现在您的代码中? f 是什么,那个在哪里?
  • 我不完全确定,因为这是我得到的代码,我必须让它与主要功能一起使用。我见过一个类似的例子,如果有帮助的话,result=p.map(sqrt,[1,2,3])
  • 那么f呢?
  • 什么是主要功能?你是如何调用上面的代码的?我们不知道你没有向我们展示什么,如果你不能让某些东西工作,请提供minimal reproducible example 以及描述它是如何不起作用的。
  • 我的笔记中有以下评论:# f 是一个接受单个参数的函数 我最好的猜测是 f(x) 是素数函数(检查数字是否为素数)并且通过在 pool_process 函数中调用 f 我正在调用 f(x)。

标签: python python-multiprocessing


【解决方案1】:

第三个代码sn-p中的data需要是一个列表。

变量data 被输入pool_process 作为第二个参数。

data = [15488801]
pool_process(check_prime, data, 1)

在那里它被提供给Pool.map作为迭代的参数。

def pool_process(f,data,pool_size):
    # ...
    result = pool.map(f, data)

在我将该整数放入列表(并更正import 语句)后,代码在我的机器上运行良好。

【讨论】:

  • 我确实尝试过使用列表形式的数据变量data = [15488801],但它只是陷入了无限循环。
  • 您是否尝试过使用较低的值进行测试,例如data = [11]?
  • 是的,刚刚试过。无限循环。还用data = [1, 2, 3, 4] 尝试过,只是为了彻底。 “更正import 语句”是什么意思?
  • @Mariyana 是的,正如我解释的那样,它总是会抛出该错误,因为map 需要一个 iterable,就像一个列表。该无限循环可能是因为您没有使用if __name__ == '__main__': 保护,这在Windows 上是必需的
  • @juanpa.arrivillaga 在定义 pool_processes 函数后立即放置 if __name__=="__main__": 有效!感谢您的帮助! @creativecoding 谢谢你的帮助!
猜你喜欢
  • 2015-02-11
  • 2014-05-18
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2012-10-27
  • 2020-04-29
相关资源
最近更新 更多