問題タブ [cython]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
4059 参照

python - Cython で NumPy を最適化する

現在、純粋な Python で記述したコードを最適化しようとしています。このコードは、NumPy 配列を使用しているため、 NumPyを非常に頻繁に使用しています。以下に、私がCythonに変換した最も単純なクラスを示します。これは、2 つの Numpy 配列の乗算のみを行います。ここ:

私の質問は、「cython -a」が生成するCコードを見ると、非常に効率的ではないように見える多くのNumPy呼び出しがあるため、これを最適化できるかどうか、およびどのように最適化できるかです。

私が考えていたのは、2 つのforループを使用して、配列のエントリを反復処理することでした。おそらく、コンパイラを使用してこれを SIMD 演算で最適化できますか?! 試してみましたが、コンパイルできましたが、奇妙な結果になり、永遠にかかりました。置換関数のコードは次のとおりです。

ただし、前述のとおり、このコードは非常に遅く、期待どおりに機能しません。それで、私は何を間違っていますか?これを最適化し、NumPy 呼び出し操作を削除する最良の方法は何でしょうか?

0 投票する
3 に答える
2564 参照

python - Cython/Numpy コードを最適化していますか? これまでのところ、わずか 30% のパフォーマンス向上

物事を少しスピードアップするためにここで忘れたことはありますか? Tuning Timbre Spectrum Scale という本に記載されているアルゴリズムを実装しようとしています。また---他のすべてが失敗した場合、コードのこの部分をCで記述して、Pythonから呼び出すことができる方法はありますか?

コードへのリンク: Cython コード

0 投票する
1 に答える
361 参照

cython - cythonで複数の出力を持つライブラリ関数をラップする

Cython を使用してダミーの C ライブラリをラップしようとしています。

これがライブラリの.hファイルです...

最初の 2 つの関数を cython でラップするのに問題はありませんが、3 番目の関数をラップするのに問題があります。

3 番目の関数は、x を y で除算し、double 引数への 3 番目のポインターで答えを返します。関数自体は、成功または失敗のいずれかを返します。

私がラップしたい実際のライブラリは、ステータス コードを返し、関数の実際の出力がポインタを介して返される、このような状況でいっぱいです。

そのような関数をラップする適切な方法は何ですか?

ありがとう、〜エリック

0 投票する
1 に答える
1842 参照

python - cython を使用した Python の小さな配列での効率的な数学演算

大きな配列の高速計算に numpexpr を使用しますが、配列のサイズが CPU キャッシュよりも小さい場合、単純な配列計算を使用して Cython でコードを記述すると、特に関数が複数回呼び出される場合に高速になります。

問題は、Cython で配列をどのように操作するか、またはより明示的に: Cython に Python の array.array 型への直接インターフェイスがあるかどうかです。私がやりたいことは、このようなものです(簡単な例)

最初に Cython numpy ラッパーを使用して ndarrays を操作しましたが、malloc を使用して C 配列を作成する場合と比較して、ndarrays を作成するのは非常にコストがかかるようです (ただし、メモリ処理は面倒です)。

ありがとう!

0 投票する
3 に答える
516 参照

python - 確率的パーサーのメモリ使用量

範囲連結文法の CKY パーサーを作成しています。ツリーバンクを文法として使いたいので、文法が大きくなります。Python でプロトタイプ1を作成しました。数十文のツリーバンクをシミュレートするとうまく動作するように見えますが、メモリ使用量は受け入れられません。C++ で書いてみましたが、今まで C++ を使ったことがなかったので、とてもイライラしていました。ここにいくつかのデータがあります (n は、文法が基づいている文の数です):

この増加パターンは、ベスト ファースト アルゴリズムを考えると予想されるものですが、オーバーヘッドの量が気になるところです。heapy によるメモリ使用量は、これらの数値の 10 分の 1 であり、valgrind は同様のことを報告しています。この不一致の原因は何ですか? Python (または Cython) でそれについてできることはありますか? 多分それは断片化によるものですか?それとも、Python 辞書のオーバーヘッドですか?

背景: 2 つの重要なデータ構造は、エッジを確率にマッピングするアジェンダと、非終端記号と位置をエッジにマッピングする辞書です。アジェンダは heapdict (内部的に dict と heapq リストを使用) で実装され、チャートは非終端記号と位置をエッジにマッピングする辞書を使用します。議題は頻繁に挿入および削除され、チャートは挿入と検索のみを取得します。次のようなタプルでエッジを表します。

文字列は文法からの非終端ラベルであり、位置はビットマスクとしてエンコードされます。構成要素が不連続な場合、複数の位置が存在する可能性があります。したがって、このエッジは「is Mary happy」の分析を表すことができます。ここで、「is」と「happy」は両方とも VP に属します。チャート ディクショナリは、このエッジの最初の要素 (「S」、111) によってインデックス付けされます。新しいバージョンでは、再利用によるメモリの節約を期待して、この表現を転置してみました:

Python は、最初の部分が異なる位置と組み合わせて発生した場合、最初の部分を 1 回だけ保存すると考えましたが、実際にはこれが正しいかどうかはわかりません。どちらの場合でも、違いはないように見えました。

したがって、基本的に私が疑問に思っているのは、Cython やさまざまなデータ構造を使用するなど、Python の実装をさらに追求する価値があるかどうか、または C++ でゼロから作成することが唯一の実行可能なオプションであるということです。

更新: いくつかの改善の後、メモリ使用量の問題はなくなりました。最適化された Cython バージョンに取り組んでいます。コードの効率を高めるための最も有用な提案に報奨金を授与します。http://student.science.uva.nl/~acranenb/plcfrs_cython.htmlに注釈付きのバージョンがあります。

1 https://github.com/andreasvc/disco-dop/ -- test.py を実行していくつかの文を解析します。Python 2.6、nltk、およびheapdictが必要です

0 投票する
2 に答える
2231 参照

c++ - Cythonでポインタのベクトルを宣言するには?

私はそのようなことを宣言したい:

しかし、Cython は私にこのエラーを与えます:

0 投票する
1 に答える
1097 参照

python - Cython を使用して難しい C ヘッダー ファイルの Python ラッパーを作成する

しばらく前に、ctypes を使用して商用 DAQ ライブラリのシン ラッパーを作成しました。それ以来、私は Cython に出くわし、それを試してみたいと思っていました。Cython のドキュメントのほとんどは理にかなっていて、私が知っていることのほとんどを見つけましたが、ラップしているライブラリは非常に Windows 固有であり、少なくとも私ができる限り、標準の C/C++ コードとは少し異なることを行います。教えて。

これは、ヘッダー ファイルからのいくつかのスニペットです。ラップする方法が正確にはわかりません。



私が集めたものから、私の cython 定義ではおそらくこれのほとんどを無視できますか? gcc で C コードをコンパイルしようとしましたが、すべての関数定義でエラーがスローされます。ctypes を使用して、ライブラリに直接アクセスし、ヘッダー ファイルをまったく使用しませんでした。



これは基本的に、ほとんどの関数が宣言され、動作する方法です。それらはエラーコードのみを返し、それから取得するすべての重要な情報はポインターを介して行われます。戻り値の型のポインターを操作する方法に関するドキュメントには何も見つかりませんでした。おそらく十分に調べていませんでした。

これらの種類の関数をラップするための正しい方向に誰かが私を向けることができますか?

DaqError のようなものは、実際にはヘッダー ファイルで宣言された enum です。このライブラリでは、約 1500 行の enum に夢中になります。

助けてくれてありがとう、

0 投票する
3 に答える
2757 参照

python - 自動生成された C をリバース エンジニアリングしますか?

自動生成された C コードをリバース エンジニアリングするのはどれくらい簡単ですか? 私は Python プロジェクトに取り組んでおり、作業の一環として Cython を使用してスピードアップのためにコードをコンパイルしています。

これは速度の面では確かに役に立ちますが、私が働いている場所では、コードを「のぞき見」してその機能を理解しようとする人がいるのではないかと心配しています。

Cython コードは基本的に自動生成された C ですが、リバース エンジニアリングするのは非常に難しいですか?

コードをより安全にし、リバース エンジニアリングをより困難にするための推奨事項はありますか? (十分な努力をすれば、すべてをリバース エンジニアリングできると思います)。