Get number of items in a generator function.

    - memory_efficient = True, 3 times slower, but memory_efficient.
    - memory_efficient = False, faster, but cost more memory.

    **中文文档**

    计算一个生成器函数中的元素的个数。使用memory_efficient=True的方法可以避免将生成器中的
    所有元素放入内存, 但是速度稍慢于memory_efficient=False的方法。

def size_of_generator(generator, memory_efficient=True):
    """Get number of items in a generator function.

    - memory_efficient = True, 3 times slower, but memory_efficient.
    - memory_efficient = False, faster, but cost more memory.

    **中文文档**

    计算一个生成器函数中的元素的个数。使用memory_efficient=True的方法可以避免将生成器中的
    所有元素放入内存, 但是速度稍慢于memory_efficient=False的方法。
    """
    if memory_efficient:
        counter = 0
        for _ in generator:
            counter += 1
        return counter
    else:
        return len(list(generator))