在Cython中,有对应于numpy的编译时类型。编译时类型似乎比原始类型快。例如,如果我们将它们与C类型结合起来,有三个关键字可用于定义整数类型:int
、np.int
、np.int_t
。
在official tutotrial中,这三种类型都被使用了。这让我感到困惑。以下是我的问题:
使用单一的数据类型以获得更好的性能是否正确?我应该选择哪种类型呢?如果使用单一的数据类型是不正确的,那么我应该如何确定在程序的不同部分使用哪种类型?
在Cython中,有对应于numpy的编译时类型。编译时类型似乎比原始类型快。例如,如果我们将它们与C类型结合起来,有三个关键字可用于定义整数类型:int
、np.int
、np.int_t
。
在official tutotrial中,这三种类型都被使用了。这让我感到困惑。以下是我的问题:
使用单一的数据类型以获得更好的性能是否正确?我应该选择哪种类型呢?如果使用单一的数据类型是不正确的,那么我应该如何确定在程序的不同部分使用哪种类型?
2条答案
按热度按时间wribegjk1#
看起来这个教程已经非常过时了,numpy没有
int_t
,int
已经被弃用了(np.int
,而不是int
)。所以我想这回答了使用哪个int选项的问题,只有
int
,默认为np.int64
(至少在我的机器上,也可能是np.int32
)。但是,请注意,
int
有不同的大小选项,如int32
和int64
,如果您知道要存储的整数的大小,您可以在其中进行选择。vc6uscn92#
不幸的是,另一个答案是部分正确的,Cython文档看起来不幸的是部分过时了。
因此,在Cython中使用Numpy类型基本上有两个上下文:
1.是可以作为
dtype=
参数传递给Numpy函数的Python对象。这些指示Numpy要创建什么类型的数组。从Cython的Angular 来看,它们与任何其他Python对象相同。然而,Numpy将它们视为特殊指标。np.int
就是其中的一个例子(但现在已经被删除,只支持使用普通的Pythonint
)。但是,特定大小的整型数据类型(如np.int32
)仍然可用。这些不是Cython特有的。它们与您在正常Python代码中使用的相同。
1.第二个用途是作为C整数类型。
np.int_t
does exist(这是另一个答案错误的地方)。然而,它是一个C typedef,只在 Package Cython的Numpy内部的.pxd文件中公开。它们是你从Numpy得到的cimport
,而不是你从Numpy得到的import
。你可以在任何需要C类型的地方使用这些类型(例如
cdef int_t some_var
或cdef int_t[:] some_memoryview
)。它们与dtypes
的名称基本相同,但最后是_t
。作为如何将两者结合起来的一个例子,您可以创建一个2D内存视图,并为它分配一个数组,以使用行
普通的
int
类型在Cython中有两种含义。它可以用作普通的Python整数对象(例如你可以把它作为dtype
参数传递)。然而,在其他上下文中,Python将其解释为C整数。所以你可以这个也能用第一次使用它是作为一个C类型。第二个作为普通Python对象。
这有点令人困惑,因为Cython跨越了Python(其中类型只是Python对象,就像任何其他Python对象一样)和C(其中类型用于声明变量,但本身不是要传递的对象),并且并不总是清楚哪些位是C类的,哪些位是Python类的。