参考自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的停止处继续往下执行。