0

我正在将 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.pypreprocessing.pygo.pyxpreprocessing.pyx使用
import pyximport; pyximport.install() 来编译它们。你可以运行test.py。此版本使用 2d numpy 数组board来存储数据并在函数中go.pyx列出理解来处理数据。在测试期间,仅使用 numpy 数组不调用任何函数get_boardpreprocessing.pyxgo.pyboard

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.cpreprocessing.c文件是一样的。V1 不生成.c文件进行比较

更新比较.so文件
V2go.so文件不同:

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

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

4

1 回答 1

0

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

通常,在优化性能时集中精力使用好的算法并识别和消除瓶颈是一个好主意。试图盯着不同机器之间的基准测试可能只会让人头疼。

于 2017-03-20T21:07:52.690 回答