各位读者大大们大家好,今天学习python的generator生成器,并记录学习过程欢迎大家一起交流分享。
新建一个python文件命名为py3_generators.py,在这个文件中进行操作代码编写:
#定义一个函数
#nums:传递一个list列表
#返回一个平方数列表
def square_nums(nums):
result = []
for i in nums:
result.append(i * i)
return result
test_nums = square_nums([1,2,3,4,5])
print(test_nums)
#返回:[1, 4, 9, 16, 25]
#如上函数返回的是一个list
#下面转换为一个generator生成器
def generator_nums(nums):
for i in nums:
yield (i * i)
#调用生成器:
gen_nums = generator_nums([1,2,3,4,5])
print(gen_nums)
#返回为一个生成器对象:
#<generator object generator_nums at 0x0000000001E0F6D8>
#因为生成器不会一次把全部的结果加载到内存中去
#每次yield一个结果
#所以需要我们调用next()方法访问一次结果
print(next(gen_nums))#1
print(next(gen_nums))#4
print(next(gen_nums))#9
print(next(gen_nums))#16
print(next(gen_nums))#25
#每次next()返回下一个结果
#如果继续调用next():
#会出现StopIteration异常
#print(next(gen_nums))
#代替next()获取结果
#使用for进行迭代:
gen_nums = generator_nums([1,2,3,4,5])
for num in gen_nums:
print("for:",num)
#for: 1
#for: 4
#for: 9
#for: 16
#for: 25
#列表推导式生成平方数列表:
test_nums =[x*x for x in [1,2,3,4,5]]
print(test_nums)#[1, 4, 9, 16, 25]
#使用列表推导式生成平方数generator生成器
gen_nums =(x*x for x in [1,2,3,4,5])
print(gen_nums)#<generator object <genexpr> at 0x0000000001DEF6D8>
#将生成器转换为list
print(list(gen_nums))#[1, 4, 9, 16, 25]
#generator生成器具有更好的性能
#因为不会一次把全部的结果加载到内存中去
#如果列表数据有几十万,上百万等
#优先考虑使用generator生成器代替list
运行结果:
[1, 4, 9, 16, 25]
<generator object generator_nums at 0x000000000066F6D8>
1
4
9
16
25
for: 1
for: 4
for: 9
for: 16
for: 25
[1, 4, 9, 16, 25]
<generator object <genexpr> at 0x000000000066F6D8>
[1, 4, 9, 16, 25]
接下来看list和generator生成器之间的对比小例子,先创建一个自定义模块memory_profile.py,用来查看进程使用内存大小:
#这里需要
#pip install psutil
#导入psutil包
import psutil
import os
def memory_usage_psutil():
# return the memory usage in MB
process = psutil.Process(os.getpid())
mem = process.memory_info()[0] / float(2 ** 20)
return mem
新建一个python文件名为gen_vs_list.py,代码如下:
#导入自定义的内存显示模块
#memory_profile
#一个根据进程id
#查看内存使用情况的模块
#不用过于关注该模块
#主要看如下代码
#list与generator生成器
#性能之间的对比
import memory_profile
import random
import time
names = ['小虎','二丫','大宝','翠花','德彪','丽丽']
citys = ['北京','天津','上海','重庆','新疆','西藏','宁夏','内蒙古']
print('目前系统使用的内存为:{}Mb'.format(memory_profile.memory_usage_psutil()))
#定义一个list列表函数
def people_list(total):
result = []
for i in range(total):
person = {
'id':i,
'name':random.choice(names),
'city':random.choice(citys),
}
result.append(person)
return result
#定义一个generator生成器
def people_generator(total):
for i in range(total):
person = {
'id':i,
'name':random.choice(names),
'city':random.choice(citys),
}
yield person
####list方式
t1 = time.time()
people = people_list(1000000)
t2 = time.time()
####generator生成器方式
t1 = time.time()
people = people_generator(1000000)
t2 = time.time()
#将generator生成器转换为list方式
t1 = time.time()
people = list(people_generator(1000000))
t2 = time.time()
print('调用数据后系统使用的内存为:{}Mb'.format(memory_profile.memory_usage_psutil()))
print('花费了:{}s'.format(t2-t1))
#如果大家需要测试,需要分别运行每种方式查看效果!!!!
#list方式打印的结果:
#目前系统使用的内存为:13.73046875Mb
#调用数据后系统使用的内存为:285.546875Mb
#花费了:1.7310988903045654s
#generator生成器方式打印的结果:
#目前系统使用的内存为:13.734375Mb
#调用数据后系统使用的内存为:13.76953125Mb
#花费了:0.0s
#将generator生成器转换为list方式打印的结果:
#目前系统使用的内存为:13.734375Mb
#调用数据后系统使用的内存为:285.57421875Mb
#花费了:1.7410995960235596s
#由此可见如果数据结果很大的情况下
#优先考虑使用generator生成器
今天初学python的generator生成器学习就到这里!
下面的是我的公众号二维码图片,欢迎关注。