10

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

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

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

  • バッファとmemoryviewオブジェクトを「素人用語」で説明し、
  • バッファとmemoryviewオブジェクトを使用することが「Pythonの方法」であるシナリオを説明する
4

2 に答える 2

5

私が書いたハッシュ関数の行は次のとおりです。

M = tuple(buffer(M, i, Nb) for i in range(0, len(M), Nb))

これにより、長い文字列 M が長さ Nb の短い「文字列」に分割されます。ここで、Nb は一度に処理できるバイト/文字数です。次のように文字列のスライスを作成した場合に発生するように、文字列の一部をコピーせずにこれを行います。

M = tuple(M[i*Nb:i*Nb+Nb] for i in range(0, len(M), Nb))

スライスした場合と同じように、M を反復処理できるようになりました。

H = key
for Mi in M:
    H = encrypt(H, Mi)

基本的に、バッファとメモリビューは、Python での文字列の不変性、およびスライスなどの一般的なコピー動作に対処するための効率的な方法です。

メイン バッファ/メモリビュー ドキュメントは C 実装に関するものですが、標準タイプのページにはメモリビューの下に少しの情報があります: http://docs.python.org/library/stdtypes.html#memoryview-type

編集:私のブックマークでこれを見つけました。 en&client=firefox-a&gl=us&strip=1は、非常に優れた簡潔な記事です。

編集 2: When should a memoryview be used?からそのリンクを取得したことがわかりました。そもそも、その質問は詳細に回答されておらず、リンクは無効になっているため、これが役立つことを願っています.

于 2011-07-18T17:47:41.907 に答える
1

私が探していた答えの一部は、それbufferが「古い方法」であり、それが新しい方法であるということですが、2.7 にバックポートされました -ここでmemoryviewアーカイブされたブログを参照してください

これは、私が 2.7 で実装したと思っていた C API でbuffermemoryview...

Python 2.7 で作業するには、フラグを に設定memoryviewする必要があります。組み込みのソースが参考になることがわかりました。と にあります。Py_TPFLAGS_HAVE_NEWBUFFERtp_flagsbytearrayInclude/bytearrayobject.hObjects/bytearrayobject.c

于 2013-11-13T16:06:24.783 に答える