2017-03-20 1 views
0

저는 python 스크립트를 cython으로 변환하고 더 빠른 속도로 최적화하고 있습니다. 지금 나는 2 개의 버전을 가지고 있는데, 데스크톱 V2는 불행히도 V1보다 두 배 빠릅니다. V1은 V2보다 두 배 빠르며, 왜 그렇게 큰 차이가 있는지 알 수 없습니다. 두 컴퓨터 모두 사용
- 우분투를 16.04
- 파이썬 2.7.12
- 사이 썬 0.25.2
- NumPy와 1.12.1
데스크톱 :
- 인텔 ® 코어 ™ i3-4370 CPU @의 3.80GHz의 ×를 4 64 비트. 16GB RAM
랩톱 :
- 인텔 ® 코어 ™ i5-3210 CPU @ 2.5GHz x 2 64 비트. 8GB RAM가장 빠른 Cython 구현은 컴퓨터에 따라 다릅니다.

V1 - 전체 코드 here을 찾을 수 있습니다. 변경된 내용은 go.py, preprocessing.py에서 go.pyx, preprocessing.pyx
import pyximport; pyximport.install()을 사용하여 수정 한 것입니다. test.py을 실행할 수 있습니다. 이 버전에서는 데이터를 처리하기 위해 에 go.pyx에 데이터를 저장하고 get_board 함수에 목록 이해를 preprocessing.pyx에 저장하기 위해 두 번째 numpy 배열을 사용하고 있습니다. 시험 중에 어떤 기능이 go.py에만 NumPy와 배열 board에서 호출되지는

V2

을 사용 - 당신은 전체 코드 here를 찾을 수 있습니다. 꽤 많은 것들이 변경되었습니다. 아래에서이 테스트 케이스에 영향을 미치는 모든 것을 가진 목록을 찾을 수 있습니다. 모든 함수 및 변수 선언은 go.pxd이어야합니다. 이 명령을 사용하여 test.py을 실행할 수 있습니다 python test.py build_ext --inplace
차원 NumPy와 배열로 대체 :

cdef char get_board_feature(self, short location): 
    # return correct board feature value 
    # 0 active player stone 
    # 1 opponent stone 
    # 2 empty location 

    cdef char value = self.board[ location ] 

    if value == EMPTY: 
     return 2 

    if value == self.player_current: 
     return 0 

    return 1 

get_boardpreprocessing.pyx의 기능을 대체 :

cdef char board[ 362 ] 

go.pyx의 기능 get_board_feature는 NumPy와 지능형리스트를 대체 배열을 반복하고 모든 위치에 대해 을 go.pyx에 호출하는 함수가 있습니다.

@cython.boundscheck(False) 
@cython.wraparound(False) 
cdef int get_board(self, GameState state, np.ndarray[double, ndim=2] tensor, int offSet): 
    """A feature encoding WHITE BLACK and EMPTY on separate planes, but plane 0 
     always refers to the current player and plane 1 to the opponent 
    """ 

    cdef short location 

    for location in range(0, state.size * state.size): 

     tensor[ offSet + state.get_board_feature(location), location ] = 1 

    return offSet + 3 

다른 정보를 포함하거나 특정 테스트를 실행해야하는지 알려주세요.

CMP, DIFF 시험
go.cpreprocessing.c 파일과 동일한 제 V2.

goD.so goL.so differ: byte 473, line 1 

preprocessing.so 파일, 즉 어떻게 생각해야 동일하지 않은 : V1은 V2 go.so 파일이 다른됩니다 .c 파일

갱신 비교 .so 파일
을 비교하기 위해 생성하지 않습니다. .

+1

내 감정은이 코드가 너무 깊어서 (다른 사람들도 똑같이 느낄 것이라고 생각합니다.) 일반적인 충고는 다음과 같습니다. 두 시스템에서 프로파일 링을 시도하고 어떤 함수가 프로파일 링 된 데이터의 큰 차이점을 보여줄 수 있는지 확인하십시오. 당신이 그것을 얻을 수 있다면, 아마도 주요 차이점을 보여주는 함수를 사용하여 더 작은 테스트 케이스를 구성 할 수있을 것입니다. – DavidW

+1

두 번째 질문은 두 시스템의 CPU 세부 사항입니다. 하나는 32 비트이고 다른 하나는 64 비트예요 - 내가 선호하는 데이터 유형 측면에서 큰 차이를 만들 수 있다고 상상할 수 있습니까? – DavidW

+0

글쎄, 내가 언급 한 것들이 사용되고 있지만 당신의 요지를 볼 수 있고 가독성을 위해 깨끗한 버전을 만들 것입니다. CPU에 대한 좋은 지적은 그 정보를 추가 할 것입니다. – MaMiFreak

답변

0

그들은 두 개의 다른 기계이고 다르게 작동합니다. 프로세서 리뷰가 큰 벤치 마크 슈트를 사용하는 이유가 있습니다. 데스크탑 CPU는 평균적으로 성능이 좋지만 작지만 중요하지 않은 코드 두 개 사이의 실행 시간은 데스크톱 CPU를 선호하지 않습니다. 그리고 실행 시간의 차이는 확실히 선형 관계를 따를 필요가 없습니다. 성능은 항상 엄청난 양의 요소에 달려 있습니다. 가능한 설명에는 데스크탑의 더 작은 L1 및 L2 캐시와 Ivy Bridge 랩탑과 Haswell 데스크탑 사이의 AVX에서 AVX2 로의 벡터 명령 세트 변경이 포함되지만 이에 국한되지는 않습니다.

일반적으로 성능을 최적화 할 때 좋은 알고리즘을 사용하고 병목 현상을 식별하고 제거하는 데 집중하는 것이 좋습니다. 다른 기계 사이의 벤치 마크를 보려고하면 아마도 두통 만 일으킬 것입니다.

+0

감사! 이것은 내 마음을 넘어 섰다.하지만 문제의 코드는 간단한 어레이 조회, 비교 및 ​​다른 배열의 값 설정이며 어떤 컴퓨터를 사용하는지에 따라 V1 또는 V2를 선호하여 2 배의 속도 차이를 얻는 것이 극단적 인 것처럼 보인다. – MaMiFreak

+0

우리는 어떤 종류의 속도에 대해 이야기하고 있습니까? – Tapio

관련 문제