Pythonステップ3-いつリストを使わないでください

2514 ワード

このシリーズの文章は一連の学習ノートで、Python 3の原理、性能をより深く分析することを望んで、文章の中の大部分の観点はすべて原作の作者の観点(以下)で、本人は本の中の例に対して実践と総括を加えて、そして相応のPythonのC言語のソースコード(3.6.1)を結びつけて、分かち合います.原著:
  • 『High Performance Python』by O'Relly Media、著者Micha Gorelick、Ian Ozsvald
  • 『Fluent Python』by O'Relly Media、著者Luciano Ramalho
  • Pythonプログラマーはリストを使いすぎることがあります.リストが柔軟すぎて使いやすいからです.私はそうです.様々なニーズに対して、Listは良い選択ではありません.
  • が1百万個の数字を格納する必要がある場合、arrayはより良い選択であり、arrayはfloat objectを抽象化するのではなく、bytesで数字を表し、C言語のようにします.
  • 私たちはよく検査(containment checks)を含みます.例えば、1つの値が1つの集合にない場合、集合(sets)を使って、集合がメンバー検査に対して特別な最適化をしてください.
  • a = 2
    if a in [1,2,3]:
        pass
    else:
        pass
    

    Arrays
  • リストがパケット数だけの場合、array.ArrayはListよりも効率的です.arrayはすべての可変シーケンスの方法をサポートし、エクスポートデータをインポートするための追加の方法もある.frombytes, .tofile.
  • PythonのarrayのコンパクトさはC言語の配列に似ている.
  • array.tofileとarray.fromfileも便利で効率的です
  • >>> from array import array
    >>> from random import random
    >>> nums = array('d', (random() for i in range(10**7)))
    >>> nums[-1]
    0.627233014646329
    >>> 
    >>> fp = open('tmp', 'wb')
    >>> nums.tofile(fp)
    >>> fp.close()
    >>> 
    >>> nums_import = array('d')
    >>> fp = open('tmp', 'rb')
    >>> nums_import.fromfile(fp, 10**7)
    >>> nums_import[-1]
    0.627233014646329
    >>> nums_import == nums
    True
    >>> fp.close()
    >>>
    

    Memory Views
    本の中の著者は、arraysをよく使うが、Memory Viewsを知らないと、私はOUTしたと話している.私はまだ本当に知りません...Memory Viewsは内蔵タイプで、共有メモリのシーケンスであり、lets you handle slices of arrays without copying bytesである.これもNumPyのベースです.C言語では、unsigned charは1 bytes、signed charは2 bytesと多くのタイプがあり、本の列は5つのsigned charのシーケンスを作成し、unsigned charに変換し、10~、1つのbytesを修正し、signed charに戻り、その間にcopy操作はなく、メモリを処理しているだけです.これは私たちが効率的なアルゴリズムを書くのに役立ちます.
    >>> numbers = array('h', [-2,-1,0,1,2])
    >>> memv = memoryview(numbers)
    >>> memv
    
    >>> len(memv)
    5
    >>> memv[1]
    -1
    >>> memv_oct = memv.cast('B')
    >>> memv_oct.tolist()
    [254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
    >>> 
    >>> len(memv_oct)
    10
    >>> memv_oct[0]
    254
    >>> memv_oct[5] = 4
    >>> numbers
    array('h', [-2, -1, 1024, 1, 2])
    >>> 
    

    NumPyとSciPy
    言うまでもなく、この2つのライブラリはPythonを科学計算の分野で主流にし、この2つのライブラリの使用はここで紹介されていない.CとFortranの性能、PythonのAPI.