Python クラスのCython化
Python,PyQt,Pyside
で書いたコードをCython
で高速化
したいと思っています。python3.5
,cython'0.24.1
独立した関数レベルでは、実現したことが
あるのですが、クラスそのものを丸ごとCython
化するの
は、初の試みです。必要がなかったので。
ちなみにメソッドを独立にCython
化
するには、もうそのクラスのメソッドからはずして、
独立した関数として、pyxモジュールに入れていました。
何のために必要としているのかというと、
大量に抽象クラスをリストとして、取得したいと思っています。
そのために、抽象クラスをCython化し、
一つ一つの抽象クラスにかかる初期化速度を
高速化したいのです。(簡略化しています。)
これが、pure Pythonのコード。
from PySide import QtGui
from PySide import QtCore
import os
import sys
import re
import random
import another_module
class Haru(Saru):
def __init__(self,parent=None):
super(Haru,self).__init__(parent=None)
self.IQ = 1000000000000000000000000000000000000
self.waru = Waru()
self.karu = another_module.Tree()
self.taipei = "taipei"
self.malaysia = "malaysia"
self.phillipine = "phillipine"
self.bananas = [self.taipei,self.malaysia,self.phillipine]
def eat(self):
takeout = random.randint(0,2)
get_banana = self.bananas[takeout]
self.IQ += 300000000000000000000
def sleep(self):
sleeping = True
self.IQ += 100000000000000000000
time = 0
while sleeping:
self.IQ += 1000000000
time += 1
if time == 100:
break
class Saru:
pass
class Daru:
def fellows(self):
fellows = [Haru() for i in range(300)]
class Waru:
pass
このとき、単純なビルトインタイプがあるときは、どうすればいいのかわかるのですが、
大体すべてをCython化しようとすればどうすればいいのでしょうか。
例えば、こちらが上のコードをcython化したものです。(未実行)
from PySide import QtGui
from PySide import QtCore
import os
import sys
import re
import random
import another_module
cdef class Haru(Saru):
def __cinit__(self,parent=None):
super(Haru,self).__init__(parent=None)
cdef int IQ
cdef str taipei,malaysia,phillipine
cdef list bananas
# ここ!
cdef Waru waru
cdef Tree karu
self.IQ = 1000000000000000000000000000000000000
self.waru = Waru()
self.karu = another_module.Tree()
self.taipei = "taipei"
self.malaysia = "malaysia"
self.phillipine = "phillipine"
self.bananas = [self.taipei,self.malaysia,self.phillipine]
cdef void eat(self):
cdef int takeout
cdef str get_banana
takeout = random.randint(0,2)
get_banana = self.bananas[takeout]
self.IQ += 300000000000000000000
cdef void sleep(self):
cdef bool sleeping
cdef int time
sleeping = True
time = 0
while sleeping:
self.IQ += 1000000000
time += 1
if time == 100:
break
class Daru:
def fellows(self):
fellows = [Haru() for i in range(300)]
return fellows
"""IQ=indulgence quality"""
class Waru:
pass
"""infinite indulgence"""
クラスは、さまざまなタイプの複合体です。
別のモジュールを利用したり、別の自分が独自で設定した
型を使うことがよくあります。
O'REILLY の [Cython]を読むと、
大体このような状態であっていると思うのですが、
抽象化インスタンスの元手となるclass自体をCython化したほうがいいでしょうか。
それとも、下のように、抽象インスタンスを取得する関数をCython化した
ほうがいいでしょうか?(fellowsをCython化)
cdef class Daru:
cdef list fellows(self):
cdef list fellows
cdef int num = 300
cdef int i
fellows = [Haru() for i in range(num)]
return fellows
としたり、特にこの場合は、
リストの中にあるHaruをすべて、Haru型として
宣言しておく方がいいのでしょうか。
また、その場合いにはどう書けばいいのでしょうか。