Cython 的高性能阵列操作 |设置 1
尽管像 NumPy 这样的库可以执行高性能的数组处理函数来对数组进行操作。但是 Cython 也可以很好地工作。但是如何?
代码 #1:Cython函数,用于将值裁剪为简单的一维双精度数组
# work.pyx (Cython file)
cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)
cpdef clip(double[:] a, double min, double max, double[:] out):
'''
Clip the values in a to be between
min and max. Result in out
'''
if min > max:
raise ValueError("min must be <= max")
if a.shape[0] != out.shape[0]:
raise ValueError("input and output arrays must be the same size")
for i in range(a.shape[0]):
if a[i] < min:
out[i] = min
elif a[i] > max:
out[i] = max
else:
out[i] = a[i]
编译和构建扩展需要work.py
文件。
代码#2:
# importing libraries
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension(
'sample',
['sample.pyx'])]
setup(name = 'Sample app',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules)
完成上述任务后,现在我们可以检查生成的函数剪辑数组的工作情况,其中包含许多不同类型的数组对象。
代码#3:裁剪数组的工作。
# array module example
import work
import array
import numpy
arr = array.array('d', [1, -3, 4, 7, 2, 0])
print ("Array : ", arr)
# Clipping the array
work.clip(arr, 1, 4, arr)
print ("\nClipping array : ", arr)
# numpy example
arr2 = numpy.random.uniform(-10, 10, size = 1000000)
print ("\narr2 : \n", arr2)
arr3 = numpy.zeros_like(arr2)
print ("\narr3 : \n", arr3)
work.clip(arr2, -5, 5, arr3)
print ("\nClipping arr3 : \n", ar3)
print ("\nMinimum in arr3 : ", min(arr3))
print ("\nMaximum in arr3 : ", min(arr3))
输出 :
Array : array('d', [1.0, -3.0, 4.0, 7.0, 2.0, 0.0])
Clipping array : array('d', [1.0, 1.0, 4.0, 4.0, 2.0, 1.0])
arr2 :
[-9.55546017, 7.45599334, 0.69248932, ..., 0.69583148, -3.86290931, 2.37266888]
arr3 : array([ 0., 0., 0., ..., 0., 0., 0.])
Clipping arr3 :
[-5., 5., 0.69248932, ..., 0.69583148, -3.86290931, 2.37266888]
Minimum in arr3 : 5.0
Maximum in arr3 : 5.0