2012-04-21 3 views
4

그래서 나는 아래 문자열의 수백만과 수백만 가지 조합을 계산하려고 시도했지만, 내가 필요로하는 속도에 근접하지 않은 약 1,750 개의 조합만을 계산했다. 그렇다면 어떻게이 모양을 바꿀 수 있을까요? 이미 계산 된 부품을 계산하지 않고 빠른 속도를 유지하면서 동일한 부품의 여러 프로세스가 서로 다른 부품을 계산하고 있습니까? 아래 코드는 부분적으로 내가 사용 해왔다. 모든 예제가 인정 될 것입니다! 부분으로 제품을 깰itertools 제품 모듈을 "다중 처리"하는 방법은 무엇입니까?

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

답변

5

한 가지 방법은 각각의 독립적 인 작업이 첫 글자의 특정 세트로 시작하는 모든 요소를 ​​가질 수 있도록, 제품의 첫 번째 구성 요소를 파괴하는 것입니다.

import string 
import multiprocessing as mp 
import itertools 

alphabet = string.ascii_letters+string.digits+"[email protected]#$%^&*?,()-=+[]/;" 
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 실제로 뭔가를 반환 경우에만 results를 사용 할 위치를 분명히) 예를 들면 다음과 같습니다.

+0

좋아요,이 작업을 수행 한 지 10 초 만에 완료되었습니다. 나쁜 점은 내 컴퓨터의 리소스가 모두 사용되었고 거의 심장 마비였습니다. 내 스레드 관리자의 작업 관리자가 있었고 한 번에 약 80 개의 파이썬 프로세스가 실행 되었기 때문에 스레드 수를 어떻게 제한 할 수 있습니까? –

+1

:) 그게'멀티 프로세싱에서 빠진'...'입니다.''풀''을위한 것입니다. 예를 들어보십시오. '풀 (프로세스 = 4)'. 자세한 내용은 [다중 처리 문서] (http://docs.python.org/library/multiprocessing.html)를 참조하십시오. – Dougal

+0

글쎄, 나는 그것을 4 개의 프로세스로 바꾸었다. 그리고 그것은 더 나 빠졌고, 한 번에 몇 백개를 가지고 있었다. 그리고 나서 나의 컴퓨터는 부서졌다. –

1

초당 1750 개의 조합 만 얻고 싶습니까? 나는 약 1 천만을 얻고있다.

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

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

>>> test(10000) 
0.03300023078918457 
>>> test(1000000) 
0.15799999237060547 
>>> test(10000000) 
1.0469999313354492 

내 컴퓨터가 생각하지 않습니다 당신보다 훨씬 더 빨리 그.

참고 : 코드를 보여주고 싶기 때문에 답변으로 게시했습니다. 그것은 정말로 더 많은 논평입니다. 그러니 제발 upvotes 또는 downvotes.

+1

다른 점은 아마 루핑하는 동안 OP가 '인쇄'되고 있다는 것입니다. I/O가 느립니다. – Dougal

+0

글쎄 내 기본 스크립트는 실제로 다른 조합을 계산할 때 데이터베이스에 저장하므로 훨씬 더 느려집니다. –

+0

@Dougal : 동의, I/O가 느립니다. 그의 질문은 'itertools.product'를 병목으로 확인합니다. 그가 입출력으로 타이밍을 잡는다면, 이것은 그를 단서해야합니다. –

관련 문제