为了使我的Cython代码更快,我想尽可能地声明变量类型。
cpdef void __init__(self, config, protocol=None, int slave_number, int fifo_length=170, float speed_factor=1.0) except *:
assert 0 < config.watermark_height <= fifo_length
assert protocol is None
assert slave_number is int
self.config = config
self.protocol = protocol
self.slave_number = slave_number
self.speed_factor = speed_factor
2个问题:
如何将self.slave_number变量声明为int?#
如果我的cp-function参数已经将其声明为int了,那么断言(例如slave_numbers是int)是不必要的吗?
谢谢!
答案 0 :(得分:2)
Extension type中的变量在类声明中定义。根据您的情况:
cdef class SpeedClass:
cdef int slave_number
cdef ...
对__init__
的调用会将参数转换为整数,并且在无法执行操作时出错。因此,您可以将浮点值传递给函数。在函数内部,slave_numbers
始终是整数,因为无论如何它将在调用时强制转换,并且检查是无用的。我无法在文档中明确找到此信息,因此我通过一个小示例对其进行了测试(请参见下文)。
def f1(int i):
print(type(i))
return i*2
您可以从命令行进行测试
python3 -c 'import test_arguments; print(test_arguments.f1(1))'
或
python3 -c 'import test_arguments; print(test_arguments.f1(1.23))'