7

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

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

2 回答 2

11

将产品分解成多个部分的一种方法是将产品的第一个组件分解,以便每个独立的工作都具有以一组特定首字母开头的所有元素。例如:

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()

(显然你只会resultsdo_job实际返回某些东西时使用)。

于 2012-04-21T19:18:53.097 回答
2

您确定每秒只能获得 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

我不认为我的电脑比你的快得多

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

于 2012-04-21T19:26:09.113 回答