python generator yield

参考自bilibili视频https://www.bilibili.com/video/BV1aK4y1k7jZ?from=search&seid=17157681898307853268

感谢!!!

1.什么是generator?

是一个生成器,可以生成一个个东西,通过next(),是一个iterable。可以通过for循环调用

2.为什么用generator?

节约内存,节省时间。

一般的 [n*n for i in range(10000000)]  会将10000000个数都生成了,存在内存中。

但是(n*n for i in range(10000000)) 会生成 生成器,用到才会生成。

相当于,你是大胃王,能吃1000个汉堡,第一种是把1000个汉堡都买回家。

第二种,你买个汉堡机,需要的时候按动按钮,即会生成。 

显然,第一种,很占内存空间。

3.代码

import memory_profiler as mem

nums=[1,2,3,4,5]

#正则表达式
square_nums=[n*n for n in nums]
print(square_nums)

#生成器
square_nums2=(n*n for n in nums)
print(square_nums2)

for num in square_nums2:
    print(num)

运行结果:
[1, 4, 9, 16, 25]
<generator object <genexpr> at 0x7f496cc6d308>
1
4
9
16
25
import memory_profiler as mem
import time


#正则表达式
yi=1000000000
time_s=time.time()
print('生成前:',mem.memory_usage())
square_nums=[n*n*yi for n in range(10000000)]
time=time.time()-time_s
print('生成后:',mem.memory_usage())
print(time)

#生成器

print('生成前:',mem.memory_usage())
square_nums2=(n*n for n in range(10000000))

print('生成后:',mem.memory_usage())
生成前: [38.5]
生成后: [502.50390625]
1.039536714553833
生成前: [502.50390625]
生成后: [502.50390625]
0.10055947303771973
可以看出第一种方法占用了400多兆内存,用时1s多
第二种算法基本没有占用内存,用时0.1s多。

yield的使用

yi=1000000000
def cal_nums():
    num=[]
    for i in range(10):
        if i%3==0 :
            num.append(3*yi)
        elif i%5 ==0 :
            num.append(5*yi)
        else:
            num.append(i*yi)
    return num
cnums=cal_nums()


def gen_nums():
    for i in range(10):
        if i%3==0 :
            yield 3*yi
        elif i%5 ==0 :
            yield 5*yi
        else:
            yield i*yi
gnums=gen_nums()

print('This is cnums')
for num in cnums:
    print(num)

print('This is gnums')
for num in gnums:
    print(num)

输出:
This is cnums
3000000000
1000000000
2000000000
3000000000
4000000000
5000000000
3000000000
7000000000
8000000000
3000000000
This is gnums
3000000000
1000000000
2000000000
3000000000
4000000000
5000000000
3000000000
7000000000
8000000000
3000000000

yield

调用next时会从yield的停止处继续往下执行。

猜你喜欢

转载自blog.csdn.net/qq_40297851/article/details/106675264
今日推荐