7

そこで、以下の文字列の何百万もの異なる組み合わせを計算してみましたが、1秒間に約1,750の組み合わせしか計算していなかったため、必要な速度にはほど遠いものでした。では、同じものの複数のプロセスが、すでに計算されたパーツを計算せず、高速を維持しながら、異なるパーツを計算するように、これをどのように再形成するのでしょうか?以下のコードは部分的に私が使用しているものです。任意の例をいただければ幸いです!

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

2 に答える 2

11

製品をパーツに分割する1つの方法は、製品の最初のコンポーネントを分割することです。これにより、各独立したジョブには、特定の最初の文字のセットで始まるすべての要素が含まれます。例えば:

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

(明らかに、実際に何かを返したresults場合にのみ使用します)。do_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 に答える