Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “我该怎么做?”;“多进程”;itertools产品模块?_Python_Multithreading_Itertools - Fatal编程技术网

Python “我该怎么做?”;“多进程”;itertools产品模块?

Python “我该怎么做?”;“多进程”;itertools产品模块?,python,multithreading,itertools,Python,Multithreading,Itertools,所以我试着,我试着计算数百万个不同的组合,但我每秒只计算了大约1750个组合,这甚至都不接近我需要的速度。那么,我该如何重塑这一点,使同一事物的多个过程计算不同的部分,而不是计算已经计算过的部分,同时保持快速的速度?下面的代码部分是我一直在使用的。任何例子都将不胜感激 from itertools import product for chars in product("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890

所以我试着,我试着计算数百万个不同的组合,但我每秒只计算了大约1750个组合,这甚至都不接近我需要的速度。那么,我该如何重塑这一点,使同一事物的多个过程计算不同的部分,而不是计算已经计算过的部分,同时保持快速的速度?下面的代码部分是我一直在使用的。任何例子都将不胜感激

from itertools import product
for chars in product("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;", repeat = 4):
   print chars

将产品分解为多个部分的一种方法是分解产品的第一个组件,这样每个独立作业都有以某一组首字母开头的所有元素。例如:

import string
import multiprocessing as mp
import itertools

alphabet = string.ascii_letters+string.digits+"!@#$%^&*?,()-=+[]/;"
num_parts = 4
part_size = len(alphabet) // num_parts

def do_job(first_bits):
    for x in itertools.product(first_bits, alphabet, alphabet, alphabet):
        print(x)

if __name__ == "__main__":
    pool = mp.Pool()
    results = []
    for i in xrange(num_parts):
        if i == num_parts - 1:
            first_bit = alphabet[part_size * i :]
        else:
            first_bit = alphabet[part_size * i : part_size * (i+1)]
        results.append(pool.apply_async(do_job(first_bit)))

    pool.close()
    pool.join()

(如果
do_job
实际返回了某个内容,则显然您只会使用
结果)。

您确定每秒仅获得1750个组合吗?我大约有1000万

def test(n):
    start = time.time()
    count = 0
    for chars in product("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;", repeat = 4):

        count += 1
        if count == n: break
    return time.time() - start    

>>> test(10000)
0.03300023078918457
>>> test(1000000)
0.15799999237060547
>>> test(10000000)
1.0469999313354492
我认为我的电脑比你的快不了多少


注意:我将此作为答案发布,因为我想显示代码。这更像是一个评论。所以请不要投赞成票或反对票。

不同的可能是,OP正在打印,而您只是在循环;I/O速度很慢。实际上,我的主脚本正在保存到数据库中,因为它正在计算不同的组合,所以速度也慢了很多。@Dougal:同意,I/O速度很慢。他的问题指出,
itertools.product
是瓶颈。如果他在用I/O计时,这应该给他提供线索。@Noah R:根据你的评论,我认为你把真正的瓶颈误诊了。不管您将其分成多少个进程,I/O都可能是您的瓶颈。如果您将I/O分发到多个进程,让每个进程都连接到数据库,可能会更慢。好吧,因为他说它使用一个巨大的
多处理池来快速完成,显然并行性正在帮助他。。。但是,是的,
itertools.product
也显然不是真正的瓶颈。好的,我做了这个,它在大约10秒钟内完成了它的自我。糟糕的是,我所有的电脑资源都被占用了,几乎心脏病发作。我如何限制线程的数量,因为我启动了任务管理器,一次运行了大约80个python进程。:)这就是我在
multiprocessing.Pool
中遗漏的
..
的目的。例如,尝试使用
池(进程=4)
。更多信息,请参阅。我将其切换为4个进程,情况变得更糟,一次启动了几百个进程,然后我的计算机崩溃。如果你说是4个进程,那么
多处理
应该只启动4个进程——你是在代码中执行其他启动Python进程的操作吗?@NoahR我打赌你是在Windows上,对吗
multiprocessing
实际上是在Windows上导入模块,而像我这样的Unix操作系统则没有导入模块,因此池中的每个元素都会生成自己的池。使用
\uuuu main\uuuu
复选框尝试新版本。