問題タブ [memoryview]

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 に答える
2044 参照

python - 左から切り捨てることができる Python バッファ?

現在、文字列、StringIO、または cStringIO を使用してバイトをバッファリングしています。しかし、多くの場合、バッファーの左側からバイトを削除する必要があります。単純なアプローチでは、バッファ全体が再構築されます。左切り捨てが非常に一般的な操作である場合、これを行う最適な方法はありますか? Python のガベージ コレクターは、切り捨てられたバイトを実際に GC する必要があります。

これのためのアルゴリズム(バッファを小さな断片に保ちますか?)、または既存の実装が本当に役に立ちます。

編集:

これには Python 2.7 のメモリビューを使用しようとしましたが、残念ながら、元の参照が削除されると、「ビュー」の外側のデータは GC されません。

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

python - いつmemoryviewを使用する必要がありますか?

memoryviewの完全な説明はここにあります:

objmemoryviewを参照するを作成します。objはバッファプロトコルをサポートする必要があります。バッファプロトコルをサポートする組み込みオブジェクトには、とが含まれます。bytesbytearray

Aには、元のオブジェクトobjによって処理されるアトミックメモリユニットである要素memoryviewの概念があります。およびなどの多くの単純なタイプの場合、要素は1バイトですが、などの他のタイプはより大きな要素を持つ場合があります。bytesbytearrayarray.array

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

python - 配列オブジェクトからPy_bufferを取得できないのはなぜですか?

配列に関するPythonのドキュメントには、配列がバッファインターフェイスに準拠していることが明記されています。buffer_info()メソッドを使用しないこともお勧めします。しかし、PyObject_GetBuffer()を使用してC / C ++コードからPy_Bufferを取得しようとしたり、Pythonのmemoryviewを使用したりしようとすると、失敗します。

たとえば、Pythonでは(私はバージョン2.7を使用しています):

実際、Pythonのコードベースを検索すると、bytearrayobject(bytearray)、memoryobject(memoryview)、およびstringobject(str)のみに必要なPy_TPFLAGS_HAVE_NEWBUFFERフラグが設定されています。私の理解では、ドキュメントは間違っています。配列はバッファインターフェイスをサポートしていません。

バッファインターフェイスをサポートするbytearrayを使用できますが、問題は、C / C++コードで使用できるバッファを読み取るために配列の実用的なfromfile()メソッドが必要なことです。

ファイルをバッファに読み込んで、Cコードからこのバッファを使用し、メモリコピーを使用しないようにする代替手段はありますか?(私は大きなバイナリファイルを扱いたいので、コピーはあまり望ましくないオプションです)。

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

python - 非Cプログラマー向けに説明されたバッファーとMemoryviewオブジェクト

Python 2.7では、バッファとmemoryviewオブジェクト用の新しいAPIが導入されました。

それらのドキュメントを読んで、基本的な概念を理解したと思います(オブジェクトをコピーせずに、生の形式でオブジェクトの内部データにアクセスします。これは、オブジェクトデータを取得するための「より高速でメモリ消費の少ない」方法を意味すると思います)。しかし、ドキュメントを本当に理解するには、読者は私が持っているものを超えたCの知識を持っている必要があります。

誰かが時間をかけて次のことをしてくれたら、私はとても感謝しています。

  • バッファとmemoryviewオブジェクトを「素人用語」で説明し、
  • バッファとmemoryviewオブジェクトを使用することが「Pythonの方法」であるシナリオを説明する
0 投票する
1 に答える
535 参照

windows-7 - cython:mingwでのmemoryviewビルドエラー

私はcythonでいくつかのPython拡張モジュールを書いています。私が書いた拡張機能はビルドされ、うまく機能します。次に、numpy配列にアクセスするときに、型付きのmemoryviewsを使用したいと思いました。これは、いくつかの利点があるように思われるためですhttp://docs.cython.org/src/userguide/memoryviews.html

ただし、cythonコードでmemoryviewを使用するとすぐに、拡張機能のビルド時にエラーが発生します。たとえば、このテスト行を追加すると、次のようになります。

cdef double [:、:: 1] X = np.zeros((100、100))

既存の動作中のcython拡張機能に。次のエラーが発生します。

この投稿で提案されているように、gcc行に-march = i486を追加しようとしました: sync_fetch_and_add_4への未定義の参照です が、問題は解決しませんでした。さらに言えば、-march=i586と-march=pentiumも試しましたが成功しませんでした。

ここで何が起こっているのか分かりますか?

私のプラットフォームはWindows7、mingwバージョンは4.70、Cythonバージョンは0.17.1です。

ありがとう

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

python - cythonmemoryviewが予想より遅い

numpy配列にアクセスするためにcythonでmemoryviewsを使い始めました。それらが持つさまざまな利点の1つは、古いnumpyバッファサポートよりもかなり高速であることです:http: //docs.cython.org/src/userguide/memoryviews.html#comparison-to-the-old-buffer-support

ただし、古いnumpyバッファのサポートがmemoryviewsよりも高速である例があります。どうすればいいの?!memoryviewsを正しく使用しているかどうか疑問に思いますか?

これは私のテストです:

タイミングの結果は次のとおりです。

image_box1:typed numpy:100000ループ、ベスト3:ループあたり11.2 us

image_box2:memoryview:100000ループ、ベスト3:ループあたり18.1 us

これらの測定は、%timeit image_box1(im、pd、box_half_size)を使用してIPythonから実行されます。

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

opencv - CythonメモリビューをOpenCV関数に渡す

いくつかのグレースケール画像を参照するためにcythonmemoryviewsを使用しています。私が書いたいくつかの画像処理コードでこれをうまく使用しました。ここで、いくつかのOpenCV関数を使用する必要があります。残念ながら、メモリビューを画像引数としてOpenCV関数に渡すことができないようです。コードはコンパイルされますが、実行されると、OpenCV関数呼び出しで「TypeError:is notanumpyarray」で停止します。

np.asarray(my_memoryview)を使用して、memoryviewをnumpy配列に戻すことができます。これは機能しますが、データをコピーするため、処理が遅くなります。

memoryviewのドキュメントでは、numpyへの強制についてhttp://docs.cython.org/src/userguide/memoryviews.html#coercion-to-numpyについて説明 しており、memoryviewをnumpyに強制できるようになっているようです。メモリをコピーせずに配列。しかし、私が書く場合:

コンパイルエラーが発生します:「ポインタまたは配列からのみcython.arrayを作成できます」

メモリビューをOpenCV関数に渡す方法、またはデータをコピーせずにメモリビューをnumpy配列に強制変換する方法についてのヘルプをいただければ幸いです。

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

python - memoryviewオブジェクトを比較する方法は?

誰かが以下のコードについてアイデアを持っていますか?

文字列のコピーを取得するために使用せずに、memoryviewオブジェクトの文字列を比較するにはどうすればよいtobytesですか?

0 投票する
0 に答える
106 参照

ubuntu - Cython Memoryview コンパイル エラー

、(Ubuntu 11.10 64ビット)と入力Memoryviewしたことの利点を得ようとしていますが、この教科書の例でもコンパイルエラーが発生します。生成されたコードを使用しなくても、問題なくコンパイルできるようです。私は Sage で Python 2.7 を使用していますが、次のようなエラーが発生します。CythonMemoryview

gcc -fno-strict-aliasing -fwrapv -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/sergey/Python/sage-5.5/local/include/csage -I/home/sergey/Python/sage-5.5/local/include -I/home/sergey/Python/sage-5.5/local/include/python2.7 -I/home/sergey/Python/sage-5.5/local/lib/python/site-packages/numpy/core/include -I/home/sergey/Python/sage-5.5/devel/sage/sage/ext -I/home/sergey/Python/sage-5.5/devel/sage -I/home/sergey/Python/sage-5.5/devel/sage/sage/gsl -I/home/sergey/.sage/sage_notebook.sagenb/home/admin/1/code -I/home/sergey/Python/sage-5.5/local/include/python2.7 -c _home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.c -o build/temp.linux-x86_64-2.7/_home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.o -w -O2

_home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.c:2259:29: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘<strong>attribute’ before ‘.’ token _home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.c:2261:44: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘<strong>attribute’ before ‘.’ token

提案された修正:

役に立ちませんでした-私のプロセッサがそのようなディレクティブをサポートしていないというエラーが発生しました。

前もって感謝します、セルゲイ

0 投票する
5 に答える
57443 参照

python - Pythonのメモリビューのポイントは正確には何ですか

memoryviewのドキュメントを確認します。

memoryview オブジェクトを使用すると、Python コードはコピーせずにバッファ プロトコルをサポートするオブジェクトの内部データにアクセスできます。

クラスメモリビュー(obj)

obj を参照するメモリビューを作成します。obj はバッファ プロトコルをサポートする必要があります。バッファ プロトコルをサポートする組み込みオブジェクトには、bytes と bytearray があります。

次に、サンプル コードを示します。

引用は終わりました。では、詳しく見てみましょう。

したがって、上記から収集したもの:

コピーせずに buffer オブジェクトの内部データを公開するために memoryview オブジェクトを作成しますが、(オブジェクトによって提供されるメソッドを呼び出すことによって) オブジェクトで何か役に立つことを行うには、コピーを作成する必要があります!

通常、オブジェクトが大きく、スライスも大きくなる場合は、memoryview (または古いバッファ オブジェクト) が必要になります。大きなスライスを作成する場合、または小さなスライスを作成する回数が多い場合は、効率を高める必要があります。

上記のスキームでは、ここで何が欠けているかを誰かが説明できない限り、どちらの状況でもそれがどのように役立つかわかりません。

編集1:

大量のデータがあり、最初から最後まで処理を進めたいと考えています。たとえば、文字列バッファーの先頭からバッファーが消費されるまでトークンを抽出します。C 用語では、これはポインターをバッファーであり、ポインターは、バッファーの型を期待する任意の関数に渡すことができます。Pythonで同様のことを行うにはどうすればよいですか?

人々は回避策を提案します。たとえば、多くの文字列および正規表現関数は、ポインターの進行をエミュレートするために使用できる位置引数を取ります。これには 2 つの問題があります: 1 つ目は回避策であり、欠点を克服するためにコーディング スタイルを変更する必要があります。2 つ目: すべての関数が位置引数を持っているわけstartswithではありません。encode()decode()

他の人は、データをチャンクでロードするか、最大トークンより大きい小さなセグメントでバッファを処理することを提案するかもしれません。わかりましたので、これらの可能な回避策を認識していますが、言語に合わせてコーディング スタイルを曲げようとすることなく、Python でより自然な方法で作業することになっています。

編集2:

コードサンプルは物事をより明確にします。これが私がやりたいことであり、memoryview を使えば一目でできると思っていたことです。私が探している機能のためにpmview(適切なメモリビュー)を使用しましょう: