4

Juliaマニュアルの「パフォーマンスのヒント」セクションによると、複数のディスパッチに夢中になることはお勧めできません。定義している型に 3 つのパラメーターが必要なように見える状況に遭遇しました。これは、2 つの可能なタイプに対して 1 つのパラメーターのみを使用するという私の質問に関連しています。別のパラメーターを使用するだけでそこに提示された問題を解決できることに気づきましたが、私の型は次のようになります

type mytype{R<:Real, S<:Any, T<:Any}
   x::Matrix{R}
   y::Dict{Int64, Vector{S}}
   z::Dict{T, Vector{Int64}}
end

これは、ディスパッチするパラメーターがいくつかあるため、パフォーマンスの観点からはお勧めできません。mytype の関数は 3 つのパラメーターでディスパッチされ、関数の引数は正しいですか?

4

2 に答える 2

6

大丈夫だよ。必要に応じて、 Typesで複数のディスパッチを行います。それが目的です。

本当にやりたくないこと。そして、ドキュメントのその部分が得ているのは、値のディスパッチが多すぎることです。Valueを型パラメーターとして 使用することで、これを行うことができます。

値に対してディスパッチを行うと、(多くの場合) 動的なディスパッチになるという問題が発生する傾向があります。つまり、型パラメーターとして値を持つ関数を呼び出す関数は、どの関数を呼び出すかを知っているため、特殊化できません。これは、型の不安定性と密接に関連しています。多くのオプティマイザを強制終了し、julia の実行速度を Python のように遅くすることができます。

これは、値のディスパッチで間違いなく「行き過ぎ」ている私のコードの例ですVal{T}値のディスパッチを許可するためだけに存在する型を広範囲に使用します。これは非常に表現力があり、非常に簡潔ですが、代わりに条件や辞書検索を使用するため、同じコードほど速くは実行されません。(そして、それは私が喜んで行うトレードオフです、この場合)

カスタム型の型パラメーターとして値を格納するべきではないこともドキュメントに記載されています。特にあなたが彼らに派遣するつもりさえないなら。それがフィールドの目的です。

于 2016-10-28T03:31:52.880 に答える