アレイ、メモリビュー、双方向キュー

配列

私たちは番号のリストが含まれている唯一の必要がある場合は、リストよりも効率的array.array。それは.pop、.insertと.extendなどの操作に関連するすべての配列可変配列を、サポートしています。また、アレイは、ファイルから読み取り、そのような.frombytesと.tofileとして、ファイルに格納されているのより速い方法を提供します。

 

C言語の配列を有する合理としてPythonアレイ。あなたはタイプコードの配列、保存すべきデータの種類の下を表すために使用されるC言語でのこの種のコードを作成する必要があります。B型のコード例は、符号付き文字(signed char型)を表すので、整数の配列を作成するために配列(B「」)は、唯一の-128から127の範囲、バイトサイズを格納することができ、大規模な配列となるよう、我々は多くのスペースを節約することができます。そして、Pythonはあなたが配列内の指定されたタイプ以外のデータを保存することはできません。

 

実施例 2-20のように、浮動小数点開始のランダムアレイを作成し、10万人から示し、この配列がファイルに格納され、その後、どのようにファイルから配列を読み取る方法。

例2-20は、プロセスのファイルからファイルに格納され、読み出され、浮動小数点の配列を作成します

>>> からアレイインポート➊アレイ
 >>> からランダムインポートランダム
(>>>フロート=アレイ' D '、(ランダム()のための I における範囲(** 7 10 )))➋
 >>> [浮遊-1 ]➌
 0.07802343889111107 
>>> FP =オープン(' floats.bin '' WB '  >>> floats.tofile(FP)➍
 >>> fp.close()
 >>> floats2 =配列(' D ' )➎
 >>> FP =オープン( " floats.bin' ' RB '  >>> floats2.fromfile(FP、10 ** 7 )➏
 >>> fp.close()
 >>> floats2 [-1 ]➐
 0.07802343889111107 
>>> floats2 ==する➑浮遊

❶導入アレイ型。
❷イテレータオブジェクトを使用して倍精度浮動小数点(タイプコードが「D」である)のセットを確立するために、
我々は反復オブジェクトを使用することができる場合ジェネレータ式です。
配列の最後の要素を見て❸。
バイナリファイルに❹アレイ。
空の配列を浮動❺新しい倍精度。
バイナリファイルから読み取る❻千万浮動小数点。
新しい配列の最後の要素を見て❼。
2つの配列の内容を確認してください❽それはまったく同じではありません

上記のコードから、我々は、それを結論付けることができ array.tofileと使用することは非常に簡単でarray.fromfile。このコードは、レースを実行するために、あなたはそれが非常に速いでしょう。後者はビルトインを使用することができますので、より速く60倍にテキストファイルからの読み込みの速度以上での単精度浮動小数点、10万足だけで0.1秒のうち、バイナリファイルから読み取るarray.fromfileと少し実験、教えてくださいテキストの各ラインを浮遊するフロートを変換する方法。

さらに、使用 array.tofileバイナリファイルに書き込まを、浮動小数点数のようにより各列は7倍速くすべてのテキストファイルに書き込まれます。また、バイナリファイルで千万、このような数字は、それがテキストファイルであれば、我々はGeの181 515 739を必要とし、わずか80万バイトを(各浮動小数点数のための8つのバイトは、任意の追加のスペースを必要としない)取りますバイト。

また、数値型の急速なシーケンスが使用することです pickleモジュールを。pickle.dump高速処理浮動小数点アレイはarray.tofileとほぼ同じ速さです。しかし、前者は扱うことができるほとんどすべての内蔵のデジタルタイプ、ネストされたセット、さらにはユーザー定義クラスを複数備えます。達成することは、特に複雑なものは、これらのクラスが存在しないことを条件とします。

メモリー・ビュー

memoryviewは、ユーザがコピーコンテンツずに同じ配列の異なるスライスを操作可能にするビルトインクラスです。Memoryviewの概念は、numpyのに触発されました。

同様の概念がアレイとmemoryview.castモジュール、データ・メモリと異なる方法で読み取ることができ、バイトの内容は自由に動くことはありません。この概念は、C言語と任意の接続は、ほぼキャスト聞こえます。memoryview.castはあなたに新しいmemoryviewオブジェクトにメモリ内容の同じ部分をパックします。

そして、双方向キューキューの他の形態

.appendと使用.pop方法(例えば、我々はスタックとして一覧表示することができますまたは使用するキュー.appendをして(0).pop「FIFO」スタック機能をシミュレートすることができるようになります、と一緒に)。しかし、最初の要素のリストを削除する(または要素の最初の前に追加された)これらの操作は、すべての要素のリストを移動関与するので、操作等は、非常に時間がかかります。

 

collections.dequeクラス(両端キュー)はスレッドセーフで、すぐに両端からのデータ型の要素を追加または削除することができます。あなたが「最近使用したいくつかの要素」を格納するための1つのデータ型を持つようにしたい場合や、両端キューがまた良い選択です。これは、キューがフルメンバーであれば、あなたも裏側から期限切れの要素を削除し、最後に新しい要素を追加することができ、キューのサイズを指定することができ、新しい双方向キューいるためです。2-23は、キューのいくつかの双方向の典型的な動作を持っています。

  両端キューを使用した例2-23

 

>>> からコレクションをインポート両端キュー
 >>> DQ =両端キューを(maxlenを範囲(10)= 10 )➊
 >>> DQ 
両端キュー([0、 1、2、3、4、5、6、7、8、9 ]、maxlenを= 10  >>> dq.rotate(3 )➋
 >>> DQ 
両端キュー([ 7、8、9、0、1、2、3、4、5、6]、maxlenを= 10  >> > dq.rotate(-4  >>> DQ 
両端キュー([ 1、2、3、4、5、6、7、8、9、0]、maxlenを= 10  >>> dq.appendleft(-1 ) ➌
 >>> DQ 
両端キュー([ -1、1、2、3、4、5、6、7、8、9]、maxlenを= 10  >>> DQ。伸びる([11、22、33 ])➍
 >>>DQの
両端キュー([ 3、4、5、6、7、8、9、11、22、33]、maxlenを= 10  >>> dq.extendleft([10、20、30、40 ])➎
 >>> DQの
両端キュー([ 40、30、20、10、3、4、5、6、7、8]、maxlenを= 10)

 

❶MAXLENはながら、キュー要素の数を示すオプションのパラメータを収容することが可能であり
、一度設定し、この属性を変更することはできません。
❷回転操作キューは、パラメータn、N> 0を受け付け、N右端のキューである
要素は、キュー内の左側に移動されます。<0 N場合、左端のn個の要素をする
右に移動します。
操作追加するキューのテールのフル(LEN(D)== d.maxlen)にしようとすると❸
時間を、その要素の頭部が削除されます。次の行に注意し、要素0は削除される
まで。
❹3は、1,1及び2を圧迫する要素の終了時に動作を追加します。
キューは双方向に加えに❺extendleft(ITER)方法は、1つの要素反復子う
左ので、要素の逆の順序で反復子は、キューに表示されます。

ほとんどの双方向キューの実装方法は、独自のデザインは、そのようなpopleftとに適したいくつかの追加の方法があります、リストを持って回してしかし、これらのメソッドを実装するためには、双方向キューはまた、いくつかを与えた、キュー操作の途中から要素を削除することが最適化された操作の開始時と終了時だけであるので、遅くなります。

 

追加し、popleftはアトミック操作され、また、と言っ両端キューが安全にマルチスレッドプログラムでFIFOスタックの使用量として使用することができ、ユーザーがリソースロックの問題を心配する必要はありません。

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/xiangxiaolin/p/11581056.html