2017-04-06 2 views
2

최근에 SBCL에서 중첩 된 for 루프를 다루었습니다. 필자는지도로 축소 할 수있는 작업을 pmap (또는 유사한 기능)을 사용하여 쉽게 병렬로 만들 수 있음을 발견했습니다.루프 내에서 pmap을 사용하는 SBCL common lisp

기본 루프 : 나는 시도하고 다음과 같은 방법으로 루프 병렬 내 배를하기로 결정

(loop for element in list_of_lists 
    do (loop for element2 in list_of_lists2 
     ...(random_function element element2))) 

그리고 이것은 잘 작동하지만 궁금 해서요 경우 뭔가 같은 :

(defun supplementary_function (single_list list_collection) 
    "This function iterates through list_collection and executes (random_function) on pairs obtained" 
    (loop for element in list_collection 
     do (random_function single_list element))) 

(map 'nil (lambda (x) (supplementary_function x list_of_lists2)) list_of_lists1) 

필자는 성능 향상을 위해이 경우 맵을 제 경우에 pmap으로 쉽게 대체 할 수 있기를 바랍니다. 따라서 좀 더 명확히하기 위해 질문은 다음과 같습니다.

첫 번째 루프를 map으로 대체 할 수 있습니다. 각 맵 작업에서 두 ​​번째 루프는 첫 번째 루프와 전체의 단일 요소를 사용하는 특정 함수 내에서 실행됩니다. 두 번째 루프. 왜 이런 일이 불가능해서는 안되는 지에 대한 개념적 실수는 없습니다. 그러나 약간의 메모리 오류가 발생합니다. (?)

대단히 고마워요!

답변

2

이 정보가 도움이됩니까?

(loop for e1 in '(1 2 3 4 5) 
     do (loop for e2 in '(a b c d e) 
       do (print (list e1 e2)))) 

(mapc (lambda (e1) 
     (mapc (lambda (e2) 
       (print (list e1 e2))) 
       '(a b c d e))) 
     '(1 2 3 4 5)) 

(defun f (e1 e2s) 
    (mapc (lambda (e2) 
      (print (list e1 e2))) 
     e2s)) 

(mapc (lambda (e1) 
     (f e1 '(a b c d e))) 
     '(1 2 3 4 5)) 
+0

매혹적인입니다, 감사합니다! 이것은 완벽하게 설명됩니다. –