質問

私は意をwebサービスを行う多数を手動で指定した計算を速くないのに使用DLR.

い場合には長いが気軽にスキム上の一般要旨.

まIronPythonとしての図書館での計算を非常に容易に設定.私の作品がノートを与える性能の約400,000計算専用計算手順は以下のと

ScriptEngine py = Python.CreateEngine();
ScriptScope pys = py.CreateScope();

ScriptSource src = py.CreateScriptSourceFromString(@"
def result():
    res = [None]*1000000
    for i in range(0, 1000000):
        res[i] = b.GetValue() + 1
    return res
result()
");

CompiledCode compiled = src.Compile();
pys.SetVariable("b", new DynamicValue());

long start = DateTime.Now.Ticks;
var res = compiled.Execute(pys);
long end = DateTime.Now.Ticks;

Console.WriteLine("...Finished. Sample data:");

for (int i = 0; i < 10; i++)
{
    Console.WriteLine(res[i]);
}

Console.WriteLine("Took " + (end - start) / 10000 + "ms to run 1000000 times.");

がDynamicValueであるクラスを返しま乱数からのプレ配列(ドや実行時).

私の作成DLRのクラスに同じことを、いかに高い性能(~10,000,000計算しています。このクラスは、以下

class DynamicCalc : IDynamicMetaObjectProvider
{
    DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
    {
        return new DynamicCalcMetaObject(parameter, this);
    }

    private class DynamicCalcMetaObject : DynamicMetaObject
    {
        internal DynamicCalcMetaObject(Expression parameter, DynamicCalc value) : base(parameter, BindingRestrictions.Empty, value) { }

        public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)
        {
            Expression Add = Expression.Convert(Expression.Add(args[0].Expression, args[1].Expression), typeof(System.Object));
            DynamicMetaObject methodInfo = new DynamicMetaObject(Expression.Block(Add), BindingRestrictions.GetTypeRestriction(Expression, LimitType));
            return methodInfo;
        }
    }
}

と呼ばれてい/試験と同じるには、次のように:

dynamic obj = new DynamicCalc();
long t1 = DateTime.Now.Ticks;
for (int i = 0; i < 10000000; i++)
{
    results[i] = obj.Add(ar1[i], ar2[i]);
}
long t2 = DateTime.Now.Ticks;

がar1は、ar2は、ランタイムシード配列のランダムます。

の速度はこのように、この問題について教えてください指定に計上しています。私は基本的に見るので自由自在に打ち込みながら、レクサー&パーサはIronPythonはお世話になりたいと思いま必要である。

思いっきりの性能をIronPythonでは、これらのDLR、思うよういしているのかもしれません

私の例を図っていかなければなりのIronPythonエンジン?可能で良好な性能を出することはできるのでしょうか?

編集として初めての例ですが、ループのクライアントまで、フルのC#の設定変数の呼び出しpython関数:

ScriptSource src = py.CreateScriptSourceFromString(@"b + 1");

CompiledCode compiled = src.Compile();

double[] res = new double[1000000];

for(int i=0; i<1000000; i++)
{
    pys.SetVariable("b", args1[i]);
    res[i] = compiled.Execute(pys);
}

がpysはScriptScopeからpy、args1は組み立て済み配列のランダムに表示されます。この例では、実行以下のループはPythonコードを通す場合全体に配列.

役に立ちましたか?

解決

delnanコメントへの問題です。さんたちは特に何の違いはこちらをご覧下さい。のC#版だけを切り出し、大量の動的な電話して持っているPythonのバージョン。まずごループを入力するときはintというar1は、ar2は強く型付けされた配列.このようにC#版のみの機動的な事業運営きに呼び出obj.Add(1運用クライアントまで、フルのC#)可能性や、課題の結果の場合はどう対応すればよいですかるオブジェクトという可能性は低い。もすべてのこのコードがロックを無料です。

のPythonのバージョン一先配分リスト-これ時のタイマの場としてクライアントまで、フルのC#で作成します。その後の動的呼び出範囲で、幸いにもこだけが起こります。その再生の巨大なリストをメモリdelnanを示唆しxrangeは改善します。そして、ループカウンターまかすという弁当をオブジェクト毎に繰り返し処理のループを実行します。そして、コールb.GetValue()が実際に2動的invocatiosn初、乗員のGetValue"方法及びそれを呼び出する結合方法オブジェクトです。これはものをつ新しいオブジェクト毎に繰り返し処理のループを実行します。その結果、b.GetValue()可能な値の配毎になります。その後を追加したり1その結果、他のボクシングの操作毎になります。ただ、ここにリストしている他動運転-この最終動作をロックを、リストは一貫したものdelnanの提案リストを使用して読解力の向上にあります。

その概要中にループしてい:

                            C#       IronPython
Dynamic Operations           1           4
Allocations                  1           4
Locks Acquired               0           1

なので基本的にはPythonの動的挙動はしてもらったりのコストvs C#.ご希望の場合は両方の長所を試すことができ、バランスに使うクライアントまで、フルのC#vsん。たとえば、書き、ループのクライアントまで、フルのC#として呼ぶの委譲であるPython関数(すいです。GetVariable>への機能の範囲として代表).できる配置。純の配列結果の場合の必要はなメーカーとしての性能でワーキングセット、GC複合っていない周りの気配値です。

に委譲するユーザーの書き:

def computeValue(value):
    return value + 1

そしてC#コードです:

CompiledCode compiled = src.Compile();
compiled.Execute(pys);
var computer = pys.GetVariable<Func<object,object>>("computeValue");

今ことができるの?

for (int i = 0; i < 10000000; i++)
{
    results[i] = computer(i);
}

他のヒント

計算速度を心配しているなら、見たほうがいいですか ローレベル 計算仕様? PythonとC#は高レベルの言語であり、その実装ランタイムは潜入作業に多くの時間を費やすことができます。

このLLVMラッパーライブラリをご覧ください。 http://www.llvmpy.org

  • 使用してインストールしてください。 pip install llvmpy ply
  • またはDebian Linuxで: apt install python-llvmpy python-ply

まだ小さなコンパイラを書く必要があります(使用できます Plyライブラリ)、およびLLVM JITコール(LLVM実行エンジンを参照)でバインドしますが、このアプローチはより効果的です(実際のCPUコードにはるかに近いコード)、および マルチプラットフォーム .NET刑務所と比較。

LLVMは使用する準備ができています コンパイラの最適化 多くのオプティマイザーステージモジュールや、大規模なユーザーおよび開発者コミュニティを含むインフラストラクチャ。

こちらもご覧ください: http://gmarkall.github.io/tutorials/llvm-cauldron-2016

PS:あなたがそれに興味があるなら、私は私のプロジェクトのマニュアルに並行して貢献するコンパイラであなたを助けることができます。しかし、それはジャンプスタートではありません、このテーマは私にとっても新しいものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top