Cython中的NumPy:编译时类型与原始类型

zzlelutf  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(105)

在Cython中,有对应于numpy的编译时类型。编译时类型似乎比原始类型快。例如,如果我们将它们与C类型结合起来,有三个关键字可用于定义整数类型:intnp.intnp.int_t
official tutotrial中,这三种类型都被使用了。这让我感到困惑。以下是我的问题:
使用单一的数据类型以获得更好的性能是否正确?我应该选择哪种类型呢?如果使用单一的数据类型是不正确的,那么我应该如何确定在程序的不同部分使用哪种类型?

wribegjk

wribegjk1#

看起来这个教程已经非常过时了,numpy没有int_tint已经被弃用了(np.int,而不是int)。
所以我想这回答了使用哪个int选项的问题,只有int,默认为np.int64(至少在我的机器上,也可能是np.int32)。
但是,请注意,int有不同的大小选项,如int32int64,如果您知道要存储的整数的大小,您可以在其中进行选择。

vc6uscn9

vc6uscn92#

不幸的是,另一个答案是部分正确的,Cython文档看起来不幸的是部分过时了。
因此,在Cython中使用Numpy类型基本上有两个上下文:
1.是可以作为dtype=参数传递给Numpy函数的Python对象。这些指示Numpy要创建什么类型的数组。从Cython的Angular 来看,它们与任何其他Python对象相同。然而,Numpy将它们视为特殊指标。np.int就是其中的一个例子(但现在已经被删除,只支持使用普通的Python int)。但是,特定大小的整型数据类型(如np.int32)仍然可用。

arr = np.zeros((5,10), dtype=np.int)

这些不是Cython特有的。它们与您在正常Python代码中使用的相同。
1.第二个用途是作为C整数类型。np.int_tdoes exist(这是另一个答案错误的地方)。然而,它是一个C typedef,只在 Package Cython的Numpy内部的.pxd文件中公开。它们是你从Numpy得到的cimport,而不是你从Numpy得到的import
你可以在任何需要C类型的地方使用这些类型(例如cdef int_t some_varcdef int_t[:] some_memoryview)。它们与dtypes的名称基本相同,但最后是_t
作为如何将两者结合起来的一个例子,您可以创建一个2D内存视图,并为它分配一个数组,以使用行

cdef np.int32_t[:,:] mview = np.zeros((5, 10), dtype=np.int32)

普通的int类型在Cython中有两种含义。它可以用作普通的Python整数对象(例如你可以把它作为dtype参数传递)。然而,在其他上下文中,Python将其解释为C整数。所以你可以

cdef int[:,:] mview = np.zeros((5, 10), dtype=int)

这个也能用第一次使用它是作为一个C类型。第二个作为普通Python对象。
这有点令人困惑,因为Cython跨越了Python(其中类型只是Python对象,就像任何其他Python对象一样)和C(其中类型用于声明变量,但本身不是要传递的对象),并且并不总是清楚哪些位是C类的,哪些位是Python类的。

相关问题