在cython中,我有点难以处理这么多的int
数据类型。
np.int, np.int_, np.int_t, int
我猜纯python中的int
等同于np.int_
,那么np.int
是从哪里来的呢?我找不到努比的文件?另外,既然我们已经有了np.int_
,为什么np.int_
还存在?
在cython中,当用作cdef int
或ndarray[int]
时,int
会变成C类型,而当用作int()
时,它会保持为python的caster?
np.int_
是否等同于C中的long
?那么cdef long
与cdef np.int_
是相同的吗?
在什么情况下我应该使用np.int_t
而不是np.int
?e、 g.cdef np.int_t
,ndarray[np.int_t]
。。。
有人能简单地解释一下这些类型的错误使用将如何影响已编译cython代码的性能吗?
这有点复杂,因为名字根据上下文有不同的含义。
int
在Python中
int
通常只是一个Python类型,它具有任意精度,这意味着您可以在其中存储任何可能的整数(只要您有足够的内存)。但是,当您使用它作为NumPy数组的
dtype
时,它将被解释为np.int_
1。它不是任意精度的,它的大小与C的long
相同:这也意味着以下两项是等效的:
作为Cython类型标识符,它有另一个含义,这里它代表c类型
int
。它的精度有限(通常是32位)。您可以将其用作Cython类型,例如在使用cdef
定义变量时:作为
cdef
或cpdef
函数的返回值或参数值:作为
ndarray
的“通用”:对于类型铸造:
可能还有更多。
在Cython中,但作为Python类型。您仍然可以调用
int
,您将得到一个“Python int”(任意精度),或者将其用于isinstance
,或者用作np.array
的dtype
参数。这里上下文很重要,因此转换为Pythonint
与转换为C int不同:np.int
其实这很简单。它只是
int
的别名:所以上面的所有内容也适用于
np.int
。但是,除非在cimport
ed包上使用它,否则不能将其用作类型标识符。在这种情况下,它表示Python整数类型。这将要求
obj
是Python整数,而不是NumPy类型:我对
np.int
的建议是:尽可能避免。在Python代码中,它相当于int
,在Cython代码中,它也相当于Python sint
,但是如果用作类型标识符,它可能会使您和所有阅读代码的人感到困惑!我真的很困惑。。。np.int_
实际上它只有一个含义:它是一个表示标量NumPy类型的Python类型。你用它就像Python一样
int
:或者使用它指定
dtype
,例如使用np.array
:但在Cython中不能将其用作类型标识符。
cnp.int_t
它是
np.int_
的类型标识符版本。这意味着您不能将其用作数据类型参数。但是可以将其用作cdef
声明的类型:这个示例(希望)显示了带有尾随
_t
的类型标识符实际上表示使用不带尾随t
的dtype的数组类型。你不能用Cython码交换它们!注释
在NumPy中还有更多的数字类型,我将包含一个列表,其中包含NumPy dtype和Cython类型标识符,以及C类型标识符,也可以在Cython中使用。但它基本上取自the NumPy documentation和Cython NumPy ^{} file :
实际上,
np.bool_
:cnp.npy_bool
和bint
都有Cython类型,但这两种类型目前都不能用于NumPy数组。对于标量,cnp.npy_bool
将只是一个无符号整数,而bint
将是一个布尔值。不知道发生了什么。。。1取自NumPy documentation "Data type objects"
np.int_
是默认的整数类型(as defined in the NumPy docs),在64位系统上,这将是一个C long
。np.intc
是默认的C int
或者int32
或者int64
。np.int
是内置int
函数的别名cython数据类型应该反映
C
数据类型,因此cdef int a
是C int
等等。对于
np.int_t
即NumPynp.int_
数据类型的Cython
编译时间等价物,np.int64_t
是Cython
编译时间等价物np.int64
相关问题 更多 >
编程相关推荐