pythonでのデータ量が非常に大きい場合、メモリスペースを節約する設定方法-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3141 ワード

下敷き部分は、まず、以下のようにリスト生成式についてお話しします
>>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
これがリスト生成式です.現在のデータ量は小さく、何も見えません.range(10)をより高い数字に変えると、すべてのリストの内容を直接印刷しているのがわかります.明らかにメモリを消費しているので、ジェネレータの概念を導入しました.例は以下の通りです.
>>>(i*2 for i in range(10)) at 0x0000000002B5A660>
角括弧を小括弧に変えるだけで、生成器を生成することができ、返される内容は生成器のメモリアドレスであり、生成されると、すべてのリストの内容にメモリアドレスを割り当てるのではなく、使用するときにメモリを割り当てることができ、リスト生成式の直接的なすべてのメモリアドレスに比べて、メモリの節約につながります.
ジェネレータの特徴:
リスト生成式は直接生成され、ジェネレータは呼び出し時に生成され、その位置にループしなければならないときに呼び出すことができ、現在の位置のみを記録し、1つしかありません.next__()メソッド、次の内容をとります.
>>> c=(i*2 for i in range(10)) >>> c[8] Traceback (most recent call last):   File "", line 1, in     c[8] TypeError: 'generator' object is not subscriptable
cをそのジェネレータに等しくして、8を直接呼び出すことはできません.まだそこに着いていないので、私たちは1つ1つ呼び出すことができます.
>>> c.__next__() 0 >>> c.__next__() 2 >>> c.__next__() 4 >>> c.__next__() 6 >>> c.__next__() 8
上は単純なジェネレータについて述べただけで、アルゴリズムが複雑な場合、forループで実現できない場合、この場合は関数を利用して実現することができ、関数を使ってジェネレータを生成することができ、以下では、関数の中でどのようにジェネレータを生成するか、一歩一歩の説明を具体的な例で説明します.
#Filename:    .py
#            yield    。
#               ,              ,              ,        
def fib(max): 
    n, a, b = 0, 0, 1
    while n < max: 
        #print(b),         print    b,  ,         ,      b    yield
        #  b           ,             
        yield b
        a, b = b, a + b
        n = n + 1
g = fib(6)#       ,   fib(6)        ,            ,  g
while True:
    #         ,  __next__()  ,     ,     
    try:
        x = g.__next__()
        print('g:', x)
    except StopIteration as e:
        #           ,         ,        ,  ,             
        print('Generator return value:', e.value)
        break

この2つのジェネレータの方法について説明します.次に、反復器について説明します.
反復可能オブジェクト:forループに直接作用するオブジェクトを反復可能オブジェクト、すなわちIterableと呼ぶ
反復器:next()関数によって呼び出され、次の値を返すオブジェクトが反復器、すなわちIterator
リスト、辞書などは反復可能なオブジェクトですが、反復器ではありません.
ジェネレータはnext()関数を呼び出すことができるため、反復器です.
では、反復オブジェクトを反復器にプログラミングするにはどうすればいいのでしょうか.
iter()メソッドを呼び出すことができます.例は次のとおりです.
>>> a=[1,2,3] >>> b=iter(a) >>> b.__next__() 1 >>> b.__next__() 2 >>> b.__next__() 3 >>> a.__next__() Traceback (most recent call last):   File "", line 1, in     a.__next__() AttributeError: 'list' object has no attribute '__next__'
これで反復器になり、aは呼び出せないことがわかります.next__()ですが、bは
最後にジェネレータの例を考えてみましょう
import time
def consumer(name):
    print("%s       !" %name)
    while True:
       baozi = yield

       print("  [%s]  , [%s]  !" %(baozi,name))

c = consumer("ChenRonghua")
c.__next__()

# b1= "   "
# c.send(b1)
# c.__next__()

def producer(name):
    c = consumer('A')
    c2 = consumer('B')
    c.__next__()
    c2.__next__()
    print("          !")
    for i in range(10):
        time.sleep(1)
        print("  1   ,   !")
        c.send(i)
        c2.send(i)

producer("   ")