我正在将 python 脚本转换为 cython 并对其进行优化以提高速度。现在我有 2 个版本,在我的台式机上,V2 的速度是 V1 的两倍,不幸的是,在我的笔记本电脑上,V1 的速度是 V2 的两倍,我无法找出为什么会有如此大的差异。两台计算机都使用:
- Ubuntu 16.04
- Python 2.7.12
- Cython 0.25.2
- Numpy 1.12.1
桌面:
- Intel® Core™ i3-4370 CPU @ 3.80GHz × 4 64bit。16GB RAM
笔记本电脑:
- Intel® Core™ i5-3210 CPU @ 2.5GHz × 2 64bit。8GB 内存
V1 - 你可以在这里找到完整的代码。所做的唯一更改是重命名go.py
、preprocessing.py
到go.pyx
和preprocessing.pyx
使用
import pyximport; pyximport.install()
来编译它们。你可以运行test.py
。此版本使用 2d numpy 数组board
来存储数据并在函数中go.pyx
列出理解来处理数据。在测试期间,仅使用 numpy 数组不调用任何函数get_board
preprocessing.pyx
go.py
board
V2 - 你可以在这里找到完整的代码。相当多的东西已经改变了,你可以在下面找到一个列表,其中列出了影响这个测试用例的所有东西。请注意,所有函数和变量声明都必须在go.pxd
. 您可以test.py
使用以下命令运行:python test.py build_ext --inplace
2d numpy 数组替换为:
cdef char board[ 362 ]
并且中的函数get_board_feature
替换go.pyx
了 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
函数 inpreprocessing.pyx
被替换为循环遍历数组并为每个位置调用get_board_feature
的函数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 测试
V2go.c
和preprocessing.c
文件是一样的。V1 不生成.c
文件进行比较
更新比较.so
文件
V2go.so
文件不同:
goD.so goL.so differ: byte 473, line 1
文件是相同的,不知道该preprocessing.so
怎么想..