是否有可能,如果是的话,如何确定 Cython 中整数数据类型的大小(以位为单位)?
我正在尝试做这样的事情,以获得整数大小:
cdef WORD_BITS = 0
IF sizeof(unsigned long long) == 8:
WORD_BITS = 64
DEF VECTOR_LENGTH_SHIFT_AMOUNT = 6
ELSE:
WORD_BITS = 32
DEF VECTOR_LENGTH_SHIFT_AMOUNT = 5
ctypedef unsigned long long word_t
cdef int vector_length(size_t bit_size):
cdef size_t size = bit_size >> VECTOR_LENGTH_SHIFT_AMOUNT
if size << VECTOR_LENGTH_SHIFT_AMOUNT < bit_size:
size += 1
return size
cdef class BitVector(object):
cdef size_t length
cdef size_t array_size
cdef word_t *array
def __cinit__(self, size_t size):
self.length = size
self.array_size = vector_length(size)
self.array = <word_t *>calloc(self.array_size, sizeof(word_t))
def __dealloc__(self):
free(self.array)
我需要处理数组元素的单个位和元素本身,因此我必须知道它们包含多少位(以计算正确的掩码/移位)。尝试像上面那样编译代码会产生:
$python setup.py build_ext --inplace
Compiling bitvector.pyx because it changed.
Cythonizing bitvector.pyx
Error compiling Cython file:
------------------------------------------------------------
...
cimport cython
# check whether we are running on a 64 or 32 bit architecture.
cdef WORD_BITS = 0
IF sizeof(unsigned long long) == 8:
^
------------------------------------------------------------
bitvector.pyx:7:3: Invalid compile-time expression
Traceback (most recent call last):
File "setup.py", line 6, in <module>
ext_modules=cythonize('bitvector.pyx')
File "/usr/lib/python2.7/dist-packages/Cython/Build/Dependencies.py", line 673, in cythonize
cythonize_one(*args[1:])
File "/usr/lib/python2.7/dist-packages/Cython/Build/Dependencies.py", line 737, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: bitvector.pyx
有没有可行的替代方案?
我知道有一个stdint.h
标题应该定义整数类型,但我想不出一种使用它的方法,因为:
- 我不知道如何检查类型是否未定义(例如,您如何
IF uint64_t is not defined:
用 cython 编写?)。 - Cython 的文档指出只有
DEF
和编译器定义的东西才能在IF
s 中检查,因此我怀疑我是否能够使用stdint.h
。
似乎这在 Cython 中是不可行的,因为我想要进行的检查只能在从 C 编译到机器代码时执行,而不是从 cython 到 C。
现在我想知道:是否可以编写一个 cython 扩展,以便在 C 源代码中添加这种检查?
我的意思是,我能以某种方式写:
cdef WORD_BITS = 0
IF sizeof(unsigned long long) == 8:
WORD_BITS = 64
DEF VECTOR_LENGTH_SHIFT_AMOUNT = 6
ELSE:
WORD_BITS = 32
DEF VECTOR_LENGTH_SHIFT_AMOUNT = 5
ctypedef unsigned long long word_t
以这样的方式,IF
Cython“没有处理”这个,但是它被传递了,在最终的 C 文件中有等效的代码?