婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python3使用迭代生成器實現減少內存占用

python3使用迭代生成器實現減少內存占用

熱門標簽:幫人做地圖標注收費算詐騙嗎 悟空智電銷機器人6 江蘇房產電銷機器人廠家 外呼不封號系統 遼寧400電話辦理多少錢 電信營業廳400電話申請 蘇州電銷機器人十大排行榜 溫州旅游地圖標注 荊州云電銷機器人供應商

技術背景

在python編碼中for循環處理任務時,會將所有的待遍歷參量加載到內存中。其實這本沒有必要,因為這些參量很有可能是一次性使用的,甚至很多場景下這些參量是不需要同時存儲在內存中的,這時候就會用到本文所介紹的迭代生成器yield。

基本使用

首先我們用一個例子來演示一下迭代生成器yield的基本使用方法,這個例子的作用是構造一個函數用于生成一個平方數組。在普通的場景中我們一般會直接構造一個空的列表,然后將每一個計算結果填充到列表中,最后return列表即可,對應的是這里的函數square_number。而另外一個函數square_number_yield則是為了演示yield而構造的函數,其使用語法跟return是一樣的,不同的是每次只會返回一個值:

# test_yield.py

def square_number(length):
    s = []
    for i in range(length):
        s.append(i ** 2)
    return s

def square_number_yield(length):
    for i in range(length):
        yield i ** 2

if __name__ == '__main__':
    length = 10
    sn1 = square_number(length)
    sn2 = square_number_yield(length)
    for i in range(length):
        print (sn1[i], '\t', end='')
        print (next(sn2))

在main函數中我們對比了兩種方法執行的結果,打印在同一行上面,用end=''指令可以替代行末的換行符號,具體執行的結果如下所示:

[dechin@dechin-manjaro yield]$ python3 test_yield.py 
0       0
1       1
4       4
9       9
16      16
25      25
36      36
49      49
64      64
81      81

可以看到兩種方法打印出來的結果是一樣的。也許有些場景下就是需要持久化的存儲函數中返回的結果,這一點用yield也是可以實現的,可以參考如下示例:

# test_yield.py

def square_number(length):
    s = []
    for i in range(length):
        s.append(i ** 2)
    return s

def square_number_yield(length):
    for i in range(length):
        yield i ** 2

if __name__ == '__main__':
    length = 10
    sn1 = square_number(length)
    sn2 = square_number_yield(length)
    sn3 = list(square_number_yield(length))
    for i in range(length):
        print (sn1[i], '\t', end='')
        print (next(sn2), '\t', end='')
        print (sn3[i])

這里使用的方法是直接將yield生成的對象轉化成list格式,或者用sn3 = [i for i in square_number_yield(length)]這種寫法也是可以的,在性能上應該差異不大。上述代碼的執行結果如下:

[dechin@dechin-manjaro yield]$ python3 test_yield.py 
0       0       0
1       1       1
4       4       4
9       9       9
16      16      16
25      25      25
36      36      36
49      49      49
64      64      64
81      81      81

進階測試

在前面的章節中我們提到,使用yield可以節省程序的內存占用,這里我們來測試一個100000大小的隨機數組的平方和計算。如果使用正常的邏輯,那么寫出來的程序就是如下所示(關于python內存占用的追蹤方法,可以參考這一篇博客):

# square_sum.py

import tracemalloc
import time
import numpy as np
tracemalloc.start()

start_time = time.time()
ss_list = np.random.randn(100000)
s = 0
for ss in ss_list:
    s += ss ** 2
end_time = time.time()
print ('Time cost is: {}s'.format(end_time - start_time))

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

for stat in top_stats[:5]:
    print (stat)

這個程序一方面通過time來測試執行的時間,另一方面利用tracemalloc追蹤程序的內存變化。這里是先用np.random.randn()直接產生了100000個隨機數的數組用于計算,那么自然在計算的過程中需要存儲這些生成的隨機數,就會占用這么多的內存空間。如果使用yield的方法,每次只產生一個用于計算的隨機數,并且按照上一個章節中的用法,這個迭代生成的隨機數也是可以轉化為一個完整的list的:

# yield_square_sum.py

import tracemalloc
import time
import numpy as np
tracemalloc.start()

start_time = time.time()
def ss_list(length):
    for i in range(length):
        yield np.random.random()

s = 0
ss = ss_list(100000)
for i in range(100000):
    s += next(ss) ** 2
end_time = time.time()
print ('Time cost is: {}s'.format(end_time - start_time))

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

for stat in top_stats[:5]:
    print (stat)

這兩個示例的執行結果如下,可以放在一起進行對比:

[dechin@dechin-manjaro yield]$ python3 square_sum.py 
Time cost is: 0.24723434448242188s
square_sum.py:9: size=781 KiB, count=2, average=391 KiB
square_sum.py:12: size=24 B, count=1, average=24 B
square_sum.py:11: size=24 B, count=1, average=24 B
[dechin@dechin-manjaro yield]$ python3 yield_square_sum.py 
Time cost is: 0.23023390769958496s
yield_square_sum.py:9: size=136 B, count=1, average=136 B
yield_square_sum.py:14: size=112 B, count=1, average=112 B
yield_square_sum.py:11: size=79 B, count=2, average=40 B
yield_square_sum.py:10: size=76 B, count=2, average=38 B
yield_square_sum.py:15: size=28 B, count=1, average=28 B

經過比較我們發現,兩種方法的計算時間是幾乎差不多的,但是在內存占用上yield有著明顯的優勢。當然,也許這個例子并不是非常的恰當,但是本文主要還是介紹yield的使用方法及其應用場景。

無限長迭代器

在參考鏈接1中提到了一種用法是無限長的迭代器,比如按順序返回所有的素數,那么此時我們如果用return來返回所有的元素并存儲到一個列表里面,就是一個非常不經濟的辦法,所以可以使用yield來迭代生成,參考鏈接1中的源代碼如下所示:

def get_primes(number):
    while True:
        if is_prime(number):
            yield number
        number += 1

那么類似的,這里我們用while True可以展示一個簡單的案例——返回所有的偶數:

# yield_iter.py

def yield_range2(i):
    while True:
        yield i
        i += 2

iter = yield_range2(0)
for i in range(10):
    print (next(iter))

因為這里我們限制了長度是10,所以最終會返回10個偶數:

[dechin@dechin-manjaro yield]$ python3 yield_iter.py

總結概要

本文介紹了python的迭代器yield,其實關于yield,我們可以簡單的將其理解為單個元素的return。這樣不僅就初步理解了yield的使用語法,也能夠大概了解到yield的優勢,也就是在計算過程中每次只占用一個元素的內存,而不需要一直存儲大量的元素在內存中。

到此這篇關于python3使用迭代生成器實現減少內存占用的文章就介紹到這了,更多相關python3實現減少內存占用內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python使用__new__()方法為對象分配內存及返回對象的引用示例
  • 關于Python內存分配時的小秘密分享
  • python內存動態分配過程詳解
  • 用python監控服務器的cpu,磁盤空間,內存,超過郵件報警
  • Python 內存管理機制全面分析
  • 總結python 三種常見的內存泄漏場景
  • Python numpy大矩陣運算內存不足如何解決
  • Python獲取android設備cpu和內存占用情況
  • python和C++共享內存傳輸圖像的示例
  • Python內存泄漏和內存溢出的解決方案
  • 詳解python的內存分配機制

標簽:景德鎮 濟南 欽州 黃山 臺灣 喀什 三沙 宿遷

巨人網絡通訊聲明:本文標題《python3使用迭代生成器實現減少內存占用》,本文關鍵詞  python3,使用,迭代,生,成器,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python3使用迭代生成器實現減少內存占用》相關的同類信息!
  • 本頁收集關于python3使用迭代生成器實現減少內存占用的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人免费黄色大片| 成人小视频免费观看| 看国产成人h片视频| 色视频成人在线观看免| 中文字幕中文在线不卡住| 极品美女销魂一区二区三区免费| 欧美日韩在线观看一区二区 | 国产精品一区二区久久精品爱涩 | 精品国产精品网麻豆系列 | 日韩午夜在线播放| 日日骚欧美日韩| 6080yy午夜一二三区久久| 美日韩一区二区三区| 久久久国产一区二区三区四区小说| 国产呦萝稀缺另类资源| 久久久久久久久久久久久女国产乱| 国产精品正在播放| 亚洲麻豆国产自偷在线| 欧美日韩国产首页在线观看| 久草热8精品视频在线观看| 精品国产网站在线观看| 丁香啪啪综合成人亚洲小说| 亚洲色图视频网站| 在线播放91灌醉迷j高跟美女| 日韩精品国产欧美| 久久精品视频在线看| 91视频国产资源| 日韩avvvv在线播放| 国产丝袜欧美中文另类| 国产传媒一区在线| 亚洲黄网站在线观看| 欧美日韩高清不卡| 国产jizzjizz一区二区| 亚洲国产精品久久不卡毛片| 精品区一区二区| 91同城在线观看| 亚洲一区二区三区四区五区黄 | 国产suv精品一区二区883| 亚洲精品伦理在线| 欧美电影免费观看高清完整版在线 | 床上的激情91.| 一个色综合网站| 777亚洲妇女| 色综合久久天天综合网| 亚洲丰满少妇videoshd| 国产精品久久久久久久裸模| 欧美成人猛片aaaaaaa| 色综合久久久久| 国产综合一区二区| 亚洲国产欧美另类丝袜| 国产精品久线观看视频| www日韩大片| 欧美视频三区在线播放| av欧美精品.com| 国产乱子伦视频一区二区三区| 亚洲一区二区三区四区在线| 亚洲欧美偷拍卡通变态| 国产日韩精品一区二区三区| 欧美一级专区免费大片| 在线日韩av片| 在线观看精品一区| 91看片淫黄大片一级| 国产精品一二一区| 国产精品一区二区三区四区 | 国产一区二区中文字幕| 日本免费新一区视频| 亚洲乱码国产乱码精品精小说| 欧美激情一区二区在线| 国产欧美精品在线观看| 日韩欧美高清dvd碟片| 欧美一级免费观看| 欧美日韩成人一区二区| 欧美日韩国产一二三| 91麻豆精品在线观看| 亚洲综合视频在线观看| 亚洲视频在线一区| 成人免费一区二区三区在线观看| 国产亚洲成aⅴ人片在线观看| 精品少妇一区二区| 精品国产免费久久| xf在线a精品一区二区视频网站| 久久精品一级爱片| 国产精品无人区| 国产精品福利一区二区三区| 亚洲男人天堂一区| 亚洲日本乱码在线观看| ...av二区三区久久精品| ●精品国产综合乱码久久久久| 久久欧美一区二区| 国产欧美一区二区在线| 国产精品理论片| 亚洲狠狠爱一区二区三区| 亚洲国产精品一区二区久久 | 麻豆91小视频| 国产乱子伦视频一区二区三区| 国产制服丝袜一区| 99r精品视频| 91精品福利在线| 欧美一级日韩免费不卡| 国产自产高清不卡| 一本久久综合亚洲鲁鲁五月天 | 亚洲成人av在线电影| 日本不卡一二三| 国产精品99久久久久久宅男| 91日韩一区二区三区| 91精品国产综合久久久蜜臀图片| 亚洲精品在线观看网站| 日韩视频免费观看高清完整版在线观看| 欧美一区二区三区播放老司机| 国产精品看片你懂得| 亚洲丶国产丶欧美一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 99久久精品国产精品久久| 91精品麻豆日日躁夜夜躁| 久久精品亚洲精品国产欧美kt∨| 国产精品第五页| 日日夜夜免费精品视频| k8久久久一区二区三区| 欧美一区二区三区日韩| 亚洲精品你懂的| 国产一区二区三区四区五区入口 | 亚洲国产综合在线| 国产一区二区免费看| 成人国产亚洲欧美成人综合网| 欧美日韩卡一卡二| 国产精品青草久久| 久久精品国产久精国产| 99精品热视频| 久久久一区二区| 日韩高清在线不卡| 91蜜桃在线观看| 国产精品入口麻豆原神| 蜜桃视频免费观看一区| 欧美无乱码久久久免费午夜一区| 欧美婷婷六月丁香综合色| 欧美国产综合一区二区| 狠狠色狠狠色综合| 日韩欧美一级特黄在线播放| 亚洲综合成人在线| 99国产精品久久久久久久久久久| 精品久久久久久久人人人人传媒 | 亚洲欧美偷拍三级| 91麻豆自制传媒国产之光| 亚洲国产精品精华液ab| 国产成人免费视频网站 | 久久国内精品自在自线400部| 欧美少妇性性性| 婷婷综合五月天| 7777精品伊人久久久大香线蕉最新版| 一区二区三区资源| 欧美亚洲一区二区在线| 亚洲精品成人在线| 色综合中文字幕国产| 国产欧美精品一区二区色综合 | 91国产免费观看| 亚洲美女淫视频| 欧美日韩国产中文| 色婷婷精品久久二区二区蜜臂av | 91极品美女在线| 亚洲私人黄色宅男| 色婷婷综合激情| 亚洲日本一区二区三区| 欧美在线三级电影| 亚洲va天堂va国产va久| 日韩欧美在线一区二区三区| 久草这里只有精品视频| 日本一区二区三区视频视频| 国产激情视频一区二区在线观看| 国产亚洲一本大道中文在线| 成人午夜伦理影院| 亚洲乱码国产乱码精品精小说 | 一区二区三区欧美激情| 欧美综合久久久| 久久99蜜桃精品| 久久视频一区二区| 色综合天天综合网天天狠天天| 亚洲愉拍自拍另类高清精品| 欧美人妇做爰xxxⅹ性高电影| 午夜精品免费在线| 2020日本不卡一区二区视频| av男人天堂一区| 日韩黄色免费电影| 中文字幕成人av| 欧美一区二区三区系列电影| 国产在线乱码一区二区三区| 亚洲精品免费视频| 久久综合99re88久久爱| 91美女在线观看| 午夜精品久久久久影视| 91精品国产综合久久久久久久 | 日本一区二区三级电影在线观看| 高清国产一区二区| 一卡二卡三卡日韩欧美| 日韩午夜在线播放| 99国产欧美久久久精品| 日韩成人免费电影| 亚洲日本欧美天堂| 久久久精品人体av艺术| 欧美va亚洲va在线观看蝴蝶网| 丰满亚洲少妇av|