저는 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_board
이 preprocessing.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.c
preprocessing.c
파일과 동일한 제 V2.
goD.so goL.so differ: byte 473, line 1
preprocessing.so
파일, 즉 어떻게 생각해야 동일하지 않은 : V1은 V2 go.so
파일이 다른됩니다 .c
파일
갱신 비교 .so
파일
을 비교하기 위해 생성하지 않습니다. .
내 감정은이 코드가 너무 깊어서 (다른 사람들도 똑같이 느낄 것이라고 생각합니다.) 일반적인 충고는 다음과 같습니다. 두 시스템에서 프로파일 링을 시도하고 어떤 함수가 프로파일 링 된 데이터의 큰 차이점을 보여줄 수 있는지 확인하십시오. 당신이 그것을 얻을 수 있다면, 아마도 주요 차이점을 보여주는 함수를 사용하여 더 작은 테스트 케이스를 구성 할 수있을 것입니다. – DavidW
두 번째 질문은 두 시스템의 CPU 세부 사항입니다. 하나는 32 비트이고 다른 하나는 64 비트예요 - 내가 선호하는 데이터 유형 측면에서 큰 차이를 만들 수 있다고 상상할 수 있습니까? – DavidW
글쎄, 내가 언급 한 것들이 사용되고 있지만 당신의 요지를 볼 수 있고 가독성을 위해 깨끗한 버전을 만들 것입니다. CPU에 대한 좋은 지적은 그 정보를 추가 할 것입니다. – MaMiFreak