gpt4 book ai didi

python - Cython 与 numpy 性能缩放

转载 作者:太空狗 更新时间:2023-10-29 19:26:41 26 4
gpt4 key购买 nike

我一直在研究 Cython,为其他工作做准备。我尝试了一个简单的测试用例,发现我的代码在处理较大问题时的执行方式有些奇怪。我创建了一个简单的 min/max 函数来计算 2D float32 数组的最小值和最大值,并将其与运行 numpy.min(a), numpy.max(a) 进行比较。对于 10000 个元素的数组,性能是相似的。对于 1000000 个元素的数组,cython 的表现要差得多。这是我的 cython 代码:

import numpy
cimport cython
cimport numpy

DTYPE = numpy.float32
ctypedef numpy.float32_t DTYPE_t

@cython.boundscheck(False)
@cython.wraparound(False)
def minmax_float32(numpy.ndarray[DTYPE_t, ndim=2] arr):
cdef DTYPE_t min = arr[0, 0]
cdef DTYPE_t max = arr[0, 0]
cdef int row_max = arr.shape[0]
cdef int col_max = arr.shape[1]
cdef int x, y
for y in range(row_max):
for x in range(col_max):
if arr[y, x] < min:
min = arr[y, x]
if arr[y, x] > max:
max = arr[y, x]

return min, max

这是我用 ipython 完成的简单计时:

a = numpy.random.random(10000).reshape((100, 100)).astype(numpy.float32)
%timeit -r3 -n50 (numpy.min(a), numpy.max(a))
# 50 loops, best of 3: 22.2 µs per loop

%timeit -r3 -n50 minmax_float32(a)
# 50 loops, best of 3: 23.8 µs per loop

a = numpy.random.random(1000000).reshape((1000, 1000)).astype(numpy.float32)
%timeit -r3 -n50 (numpy.min(a), numpy.max(a))
# 50 loops, best of 3: 307 µs per loop

%timeit -r3 -n50 minmax_float32(a)
# 50 loops, best of 3: 1.22 ms per loop

307 / 22.2
# 13.82882882882883

1220 / 23.8
# 51.26050420168067

有人知道为什么 cython 需要更长的时间来处理更大的输入吗?这只是我在玩的东西,但如果你有任何提示或技巧,我很想听听。提前致谢。

编辑:我在具有 8GB 内存的 macbook 10.10 上运行了这些测试。使用来自 macports 的 gcc 编译 cython,并使用他们的教程中提到的标志 -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing

最佳答案

看起来 NumPy 使用 SSE 指令,可用于 minmax,这意味着它们可能比 Cython 更能利用您的硬件.

这是 SSE 中 NumPy 的 minmax 缩减实现的源代码:https://github.com/numpy/numpy/blob/master/numpy/core/src/umath/simd.inc.src#L696 .请注意,他们使用预处理器同时自动为多种数据类型和操作生成代码。

关于python - Cython 与 numpy 性能缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27575395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com