最快的Cython实现取决于计算机?

时间:2017-03-20 18:45:01

标签: numpy optimization cython baduk

我正在将python脚本转换为cython并对其进行优化以提高速度。现在我有2个版本,在我的桌面上V2是V1的两倍,不幸的是在我的笔记本电脑上V1是V2的两倍,我无法找出为什么会有这么大的差异。 两台电脑都使用:
- Ubuntu 16.04
- Python 2.7.12
- Cython 0.25.2
- Numpy 1.12.1
桌面:
- 英特尔®酷睿™i3-4370 CPU @ 3.80GHz×4 64位。 16GB RAM
笔记本电脑:
- 英特尔®酷睿™i5-3210 CPU @ 2.5GHz×2 64位。 8GB RAM

V1 - 您可以找到完整代码here。所做的唯一更改是将go.pypreprocessing.py重命名为go.pyxpreprocessing.pyx并使用
import pyximport; pyximport.install()编译它们。你可以运行test.py。此版本使用2d numpy数组board来存储go.pyx中的数据,并使用get_boardpreprocessing.pyx函数中的列表理解来处理数据。在测试期间,没有函数从go.py调用,只使用了numpy数组board

V2 - 您可以找到完整代码here。相当一些东西已经改变,下面你可以找到一个包含影响这个测试用例的一切的列表。请注意,所有函数和变量声明都必须在go.pxd中。您可以使用以下命令运行test.pypython test.py build_ext --inplace
2d numpy数组被替换为:

cdef char board[ 362 ]

并且get_board_feature中的函数go.pyx取代了numpy list comprehension:

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函数将替换为循环数组的函数,并在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 test
V2 go.cpreprocessing.c文件完全相同。 V1不会生成要比较的.c文件

更新了比较.so个文件
V2 go.so文件不同:

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

preprocessing.so个文件是相同的,不知道该怎么想..

1 个答案:

答案 0 :(得分:0)

它们是两台不同的机器,行为不同。处理器评论使用大型基准测试套件是有原因的。可以说台式机CPU平均表现更好,但是两个小但非平凡的代码片段之间的执行时间并没有“支持”桌面CPU。差异执行时间绝对不必遵循任何线性关系。性能总是取决于大量因素。可能的解释包括但不限于桌面上较小的L1和L2缓存以及Ivy Bridge笔记本电脑和Haswell桌面之间从AVX到AVX2的矢量指令集的更改。

通常,在优化性能时,专注于使用优秀的算法以及识别和消除瓶颈是一个好主意。试图盯着不同机器之间的基准测试可能只会引起头痛。