Cythonの型付け

Cythonの型付け

普通のPythonとしても動く形での型付け(Pre Python Mode

デコレータ

import cython

# デコレータを使った型付け
@cython.locals(a=cython.int, sum=cython.int, i=cython.int)
@cython.returns(cython.int)
@cython.cfunc
def f(a):
    sum = 0
    for i in range(a):
        sum += i
    return sum

アノテーションPEP484

import cython


# Cの中でしか使わないぞという宣言
@cython.cfunc
def f(a: cython.int) -> cython.int:
    sum: cython.int = 0
    i: cython.int
    for i in range(a):
        sum += i
    return sum

cython.declare

補助的な使い方をする

import cython
a = cython.declare(cython.int, 100) # cdef int a = 100 と同じ

pxdファイル

a.py

# 普通にPythonを書く
def f(a):
    sum = 0
    for i in range(a):
        sum += i
    return sum

a.pxd

import cython


@cython.locals(sum=cython.int, i=cython.int)
cdef int f(int a)

Cythonのみで使える型付け

C風

cdef int f(int a):
    cdef int sum = 0
    cdef int i
    for i in range(a):
        sum += i
    return sum

お行儀の悪いコードだと思うけど許してくれ~

例の殆どが、ほぼ完全にCにコンパイルされて高速に動作する(cython -a codefileで黄色い行が無くなる)

f:id:hotate29:20210726001825p:plain

同時に複数の方法を使って型付けすることもできるので、適材適所で使っていきたい