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