前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(二十三) 初遇python甚是喜爱之generator生成器

(二十三) 初遇python甚是喜爱之generator生成器

作者头像
XXXX-user
修改2019-07-30 10:57:02
3630
修改2019-07-30 10:57:02
举报
文章被收录于专栏:不仅仅是python不仅仅是python

各位读者大大们大家好,今天学习python的generator生成器,并记录学习过程欢迎大家一起交流分享。

新建一个python文件命名为py3_generators.py,在这个文件中进行操作代码编写:

代码语言:javascript
复制
#定义一个函数
#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

运行结果:

代码语言:javascript
复制
[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,用来查看进程使用内存大小:

代码语言:javascript
复制
#这里需要
#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,代码如下:

代码语言:javascript
复制
#导入自定义的内存显示模块
#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生成器学习就到这里!

关注公号

下面的是我的公众号二维码图片,欢迎关注。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yale记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关注公号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档