2

実際には単なる「構造体」であるいくつかのクラスを使用する Python で記述されたコードがいくつかあります。これらのクラスのインスタンスには、一連のフィールドがあり、メソッドはありません。例:

class ResProperties:
    def __init__(self):
        self.endDayUtilities = 0
        self.marginalUtilities = []
        self.held = 0
        self.idleResource = True
        self.experience = 0.0
        self.resSetAside = 0
        self.unitsGatheredToday = 0

私たちのメイン コードは、このクラスのインスタンスの束を使用します。

コードを高速化するために、このクラスを cython 化したと考えました。

cdef class ResProperties:

    cdef public float endDayUtilities
    cdef public list marginalUtilities
    cdef public int held
    cdef public int idleResource
    cdef public float experience
    cdef public int resSetAside
    cdef public int unitsGatheredToday

    def __init__(self):
        self.endDayUtilities = 0
        # etc: code just like above.

しかし、その結果、コードの実行速度が 25% 遅くなりました!

コードの実行速度が低下している原因を突き止めるにはどうすればよいですか?

ありがとう。

4

1 に答える 1

5

これらのクラスを Cython に変換しましたが、まだ Python コードから使用していますか?

C から Python へのデータ変換、およびその逆のデータ変換には、オーバーヘッドが発生します。たとえば、あなたのendDayUtilitiesメンバーは C スタイルのフロートです。Python からアクセスする場合float()、Python コードで何かを行う前に、オブジェクトを構築する必要があります。Python からその属性に割り当てる場合、同じことが逆に発生する必要があります。

私の頭の中で、これらのデータ変換のパフォーマンス オーバーヘッドを見積もっています...ああ、約 25% です。:-)

そのデータを使用するコードの一部を Cython に移動するまで、パフォーマンスの向上は見られません。基本的に、C ランドに滞在できるほど、成績が向上します。行ったり来たりはあなたを殺します。

もう 1 つの簡単な方法として、Cython の代わりに Psyco または PyPy を試すこともできます。

于 2012-05-22T23:06:47.903 に答える