精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

七個Python內存優化技巧,你用過幾個?

開發 前端
本文將聚焦于Python的內置機制,并介紹七個原始但有效的內存優化技巧。掌握這些技巧將顯著提高我們的Python編程技能。

當我們的項目變得越來越大時,高效管理計算資源是一個不可避免的要求。不幸的是,與低級語言如C或C++相比,Python在內存效率方面似乎不夠。那么,現在應該更改編程語言嗎?

當然不是。事實上,有許多方法可以顯著優化Python程序的內存使用,從優秀的模塊和工具到先進的數據結構和算法。本文將聚焦于Python的內置機制,并介紹7個原始但有效的內存優化技巧。掌握這些技巧將顯著提高我們的Python編程技能。

1. 在類定義中使用__slots__

Python作為一種動態類型語言,在面向對象編程方面更加靈活。一個很好的例子是在運行時向Python類中添加額外的屬性和方法的能力。例如,下面的代碼定義了一個名為Author的類。最初它有兩個屬性name和age。但是我們可以很容易地在后來添加一個額外的屬性:

class Author:
    def __init__(self, name, age):
        self.name = name
        self.age = age

me = Author('Yang Zhou', 30)
me.job = 'Software Engineer'
print(me.job)

然而,每個硬幣都有兩面。這種靈活性在底層浪費了更多的內存。因為Python類的每個實例都維護一個特殊的字典(__dict__)來存儲實例變量。這個字典由于其基于哈希表的實現方式而固有地內存效率低下,占用大量內存。

在大多數情況下,我們不需要在運行時更改實例的變量或方法,而且在類定義之后__dict__將不會改變。因此,如果我們能避免維護__dict__字典,那就更好了。Python為此提供了一個神奇的屬性:slots。它通過指定類的所有有效屬性的名稱來充當白名單:


class Author:
    __slots__ = ('name', 'age')
    def __init__(self, name, age):
        self.name = name
        self.age = age
me = Author('Yang Zhou', 30)
me.job = 'Software Engineer'
print(me.job)
#AttributeError: 'Author' object has no attribute 'job'

如上所示,我們不能再在運行時添加job屬性。因為__slots__白名單只定義了兩個有效屬性name和age。從理論上講,由于屬性現在是固定的,Python不需要為其維護一個字典。它只需為__slots__中定義的屬性分配必要的內存空間。

讓我們編寫一個簡單的比較程序,看看它是否確實起作用:

import sys


class Author:
    def __init__(self, name, age):
        self.name = name
        self.age = age


class AuthorWithSlots:
    __slots__ = ['name', 'age']

    def __init__(self, name, age):
        self.name = name
        self.age = age


# Creating instances
me = Author('Yang', 30)
me_with_slots = AuthorWithSlots('Yang', 30)

# Comparing memory usage
memory_without_slots = sys.getsizeof(me) + sys.getsizeof(me.__dict__)
memory_with_slots = sys.getsizeof(me_with_slots)  # __slots__ classes don't have __dict__

print(memory_without_slots, memory_with_slots)
# 152 48
print(me.__dict__)
# {'name': 'Yang', 'age': 30}
print(me_with_slots.__dict__)
# AttributeError: 'AuthorWithSlots' object has no attribute '__dict__'

正如上面的代碼所演示的,由于使用了__slots__,me_with_slots實例不具有__dict__字典。與必須保留額外字典的me實例相比,這有效地節省了內存資源。

2. 使用生成器

生成器是Python中的惰性求值版本的列表。它們就像元素生成工廠:僅在調用next()方法時生成一個項目,而不是一次計算所有項目。因此,當處理大型數據集時,它們非常內存高效。

def number_generator():
    for i in range(100):
        yield i

numbers = number_generator()
print(numbers)

print(next(numbers))
#0
print(next(numbers))
#1

上面的代碼展示了編寫和使用生成器的基本示例。關鍵字yield是生成器定義的核心。應用它意味著只有在調用next()方法時才會產生項目i。現在,讓我們比較一下生成器和列表,看看哪個更內存高效:

import sys


numbers = []
for i in range(100):
    numbers.append(i)

def number_generator():
    for i in range(100):
        yield i

numbers_generator = number_generator()
print(sys.getsizeof(numbers_generator))
#112
print(sys.getsizeof(numbers))
#920

上述程序的結果證明了使用生成器可以顯著節省內存使用。順便說一下,如果我們將列表推導式的方括號改成括號,它將變成生成器表達式。這是在Python中定義生成器的更簡便的方法:

import sys
numbers = [i for i in range(100)]
numbers_generator = (i for i in range(100))
print(sys.getsizeof(numbers_generator))
#112
print(sys.getsizeof(numbers))
#920

3. 利用內存映射文件支持大文件處理

內存映射文件I/O,簡稱“mmap”,是一種操作系統級別的優化。

它實現了需求分頁,因為文件內容并不立即從磁盤讀取,并且最初根本不使用物理RAM。實際從磁盤讀取是在特定位置被訪問時以懶惰的方式執行的。

—— 維基百科

簡單來說,當使用mmap技術內存映射文件時,它在當前進程的虛擬內存空間中直接創建文件的映射,而不是將整個文件加載到內存中。映射而不是加載整個文件可以節省大量內存。

聽起來很復雜?幸運的是,Python已經提供了一個用于使用這種技術的內置模塊,因此我們可以輕松利用它,而不必考慮操作系統級別的實現。例如,這是在Python中使用mmap進行文件處理的方法:

import mmap


with open('test.txt', "r+b") as f:
    # memory-map the file, size 0 means whole file
    with mmap.mmap(f.fileno(), 0) as mm:
        # read content via standard file methods
        print(mm.read())
        # read content via slice notation
        snippet = mm[0:10]
        print(snippet.decode('utf-8'))

如上所演示的,Python使得內存映射文件I/O技術的使用變得方便。我們所需要做的就是簡單地應用`mmap.mmap()`方法,然后使用標準文件方法或甚至切片表示法處理打開的對象。

4. 減少全局變量的使用

全局變量在程序運行期間始終駐留在內存中,因為它們具有全局范圍。因此,如果一個全局變量保存一個大型數據結構,它將在整個程序生命周期中占用內存,可能導致內存使用效率低下。我們應該在Python代碼中盡量減少全局變量的使用。

5. 利用邏輯運算符的短路求值

這個技巧似乎微妙,但巧妙地使用它將極大地節省程序的內存使用。例如,下面是一個簡單的代碼片段,根據兩個函數返回的布爾值得到最終結果:

result_a = expensive_function_a()
result_b = expensive_function_b()
result = result_a if result_a else result_b

上面的代碼能夠工作,但實際上執行了兩個內存效率低下的函數。獲取相同結果的更聰明的方法如下:

result = expensive_function1() or expensive_function2()

由于邏輯運算符遵循短路求值規則,上述代碼中的`expensive_function2()`將不會在`expensive_function1()`為True時執行。這將節省不必要的內存使用。

6. 謹慎選擇數據類型

一位經驗豐富的Python開發者會仔細而準確地選擇數據類型。因為在某些場景中,使用一個數據類型比另一個更節省內存。

元組比列表更節省內存

由于元組是不可變的(在創建后不能更改),它允許Python在內存分配方面進行優化。然而,列表是可變的,因此需要額外的空間來容納潛在的修改。

import sys
my_tuple = (1, 2, 3, 4, 5)
my_list = [1, 2, 3, 4, 5]
print(sys.getsizeof(my_tuple))
#80
print(sys.getsizeof(my_list))
#120

如上面的片段所示,即使它們包含相同的元素,元組`my_tuple`使用的內存比列表更少。因此,如果在創建后不需要更改數據,我們應該更喜歡使用元組而不是列表。

(1) 數組比列表更節省內存

Python中的數組要求元素是相同的數據類型(例如,全部整數或全部浮點數),但列表可以存儲不同類型的對象,這必然需要更多的內存。因此,如果列表的元素都是相同類型,使用數組會更節省內存:

import sys
import array
my_list = [i for i in range(1000)]
my_array = array.array('i', [i for i in range(1000)])
print(sys.getsizeof(my_list))
#8856
print(sys.getsizeof(my_array))
#4064

(2) 優秀的數據科學模塊比內置數據類型更高效

Python是數據科學的主導語言。有許多強大的第三方模塊和工具提供了更多的數據類型,例如NumPy和Pandas。如果我們只需要一個簡單的一維數字數組,并且不需要NumPy提供的廣泛功能,那么Python內置的數組可能是一個不錯的選擇。

但是,當涉及到復雜的矩陣操作時,對于所有數據科學家來說,使用NumPy提供的數組是第一選擇,可能是最好的選擇。

7. 對相同的字符串應用字符串駐留技術

下面的代碼可能會使許多開發者感到困惑:

>>> a = 'Y'*4096
>>> b = 'Y'*4096
>>> a is b
True
>>> c = 'Y'*4097
>>> d = 'Y'*4097
>>> c is d
False

正如我們所知,`is`運算符用于檢查兩個變量是否引用內存中的同一對象。它與`==`運算符不同,后者用于比較兩個對象是否具有相同的值。那么為什么`a is b`返回True,而`c is d`返回False呢?

這里有Python中的一個隱秘技巧 —— 字符串駐留技術。如果有幾個值相同的小型字符串,它們將由Python隱式地進行駐留,并引用內存中的同一對象。定義小型字符串的神奇數字是4096。由于`c`和`d`的長度都是4097,它們是內存中的兩個對象而不是一個。不再有隱式的字符串駐留。因此,在執行`c is d`時得到False。

字符串駐留是一種優化內存使用的強大技術。如果我們想要顯式地進行駐留,sys.intern()方法就派上用場了:

>>> import sys
>>> c = sys.intern('Y'*4097)
>>> d = sys.intern('Y'*4097)
>>> c is d
True

順便說一下,除了字符串駐留,Python還對小整數應用駐留技巧。我們也可以利用它進行內存優化。

責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2023-03-19 16:02:33

JavaScrip技巧編程語言

2021-08-17 10:08:44

HTML網站網絡

2021-03-22 16:55:14

Java程序員內存

2015-11-30 17:12:31

Git使用技巧

2024-03-07 08:08:51

SQL優化數據

2009-05-20 16:17:39

Linux硬盤技巧

2019-10-09 08:24:33

爬蟲框架Python

2023-08-22 10:25:19

CSS動畫網頁

2024-08-13 08:00:00

2025-09-19 05:00:00

HTML href空值占位

2025-03-21 08:20:00

數據清洗Python編程

2023-09-07 16:28:46

JavaScrip

2021-11-22 12:13:54

Linuxwget 命令

2021-04-15 11:28:55

微信技巧語言

2022-12-12 13:19:11

Vue3開發技巧

2025-03-20 07:09:52

2023-11-28 12:07:06

Python代碼

2021-11-09 06:55:02

Windows 10系統技巧

2022-04-14 10:40:11

領導者IT團隊遠程團隊

2024-06-25 15:41:41

點贊
收藏

51CTO技術棧公眾號

蜜臀久久精品| 国产视频手机在线观看| 丝袜连裤袜欧美激情日韩| 色域天天综合网| 亚洲精品一卡二卡三卡四卡| 国产精品一级二级| 亚洲精品女人| 在线亚洲午夜片av大片| 成年人网站av| japanese23hdxxxx日韩| 亚洲精品大片www| 久久人人九九| 国产视频一区二区三区四区五区| 亚洲黄色免费| 久久精品电影一区二区| 屁屁影院国产第一页| 久久伊人国产| 精品高清美女精品国产区| 亚洲一区不卡在线| 婷婷色在线视频| 国内成人自拍视频| 538国产精品一区二区在线| 国产喷水在线观看| 亚洲激情77| 精品久久久久久久久久久久久久久久久 | 日本一区二区三区视频| 337p日本欧洲亚洲大胆色噜噜| 午夜免费精品视频| 美足av综合网| 亚洲欧洲性图库| 日本三级中国三级99人妇网站| 性一交一乱一透一a级| 免费观看日韩av| 8x拔播拔播x8国产精品| 九九热精品在线观看| 第一会所sis001亚洲| 亚洲国产精品久久久久秋霞蜜臀 | 欧美黑人性视频| 5566中文字幕| 国产欧美日韩视频在线| 亚洲精品av在线播放| 色婷婷狠狠18禁久久| 24小时成人在线视频| 欧美在线999| 国产精品久久久久9999小说| 亚洲国产欧美日本视频| 五月综合激情婷婷六月色窝| 99在线免费视频观看| 2020国产在线视频| 亚洲男人的天堂网| 久久最新免费视频| 成人在线免费看黄| 亚洲欧美偷拍三级| 中国一级黄色录像| www在线视频| 一区二区三区四区中文字幕| 蜜臀在线免费观看| www.久久ai| 一区二区在线观看视频| 日本精品福利视频| 肉肉视频在线观看| 亚洲成人你懂的| 欧美亚洲日本一区二区三区 | 国产精品自在线| 中国女人真人一级毛片| 久久国产三级精品| 亚洲a在线观看| 国产a级免费视频| 国产精品1024久久| 国产一区二区三区免费不卡| 色婷婷综合视频| 91亚洲精品乱码久久久久久蜜桃| 国产伦精品一区二区三区高清| 亚洲精品综合久久| 99视频一区二区| 欧美一区二区福利| 婷婷视频在线| 亚洲精品久久久蜜桃| 阿v天堂2018| 亚洲第一影院| 欧美喷潮久久久xxxxx| 亚洲精品免费一区亚洲精品免费精品一区| 日本亚洲欧洲无免费码在线| 日韩一区二区视频| 国产一级二级在线观看| 成人午夜av| 久久国产精品影视| 国产成人无码精品| 麻豆久久久久久久| 官网99热精品| 高清在线观看av| 亚洲老妇xxxxxx| 毛片在线视频播放| 欧美亚洲黄色| 亚洲国产小视频| 国产综合精品久久久久成人av| 久久久久亚洲| 欧美亚洲视频在线看网址| 中文字幕一区二区三区波野结| 国产91精品久久久久久久网曝门| 精品一区二区三区国产| 免费在线观看av网站| 午夜激情久久久| 男操女免费网站| 成人激情自拍| 久久精品福利视频| 国产午夜精品久久久久| 国产大片一区二区| 日韩视频精品| а√在线天堂官网| 欧美精品v日韩精品v韩国精品v| 国产污在线观看| 色综合咪咪久久网| 欧美孕妇性xx| www天堂在线| 国产精品污www在线观看| www.xxx麻豆| 日本一区二区中文字幕| 日韩经典中文字幕在线观看| 国产67194| 日本伊人色综合网| 久久99热只有频精品91密拍| a视频在线免费看| 日本高清免费不卡视频| 国产免费a级片| 亚洲网色网站| 国产精品中文字幕在线观看| 三级黄视频在线观看| 夜夜嗨av一区二区三区网页| 手机免费av片| 国产综合久久久| 91成人在线播放| 乱精品一区字幕二区| 亚洲免费毛片网站| 久久久精品高清| 久久精品av| 国产激情久久久久| 全色精品综合影院| 欧美日韩美女在线| 久久久久9999| 99精品福利视频| 国产精品久久久久免费| 色爱综合区网| 精品福利一二区| 久久久久黄色片| 国产成人h网站| 大陆极品少妇内射aaaaaa| 国产精品视频一区视频二区| 色噜噜狠狠色综合网图区| 最新中文字幕第一页| 国产三区在线成人av| 黄色av免费在线播放| 久久91成人| 国产激情综合五月久久| 98在线视频| 欧美精品v国产精品v日韩精品| 四虎永久免费地址| 国产一区二区精品在线观看| 欧美 国产 精品| 9国产精品午夜| 91高清视频免费观看| 日本国产在线| 在线观看日韩一区| 四虎国产成人精品免费一女五男| 日本亚洲欧美天堂免费| 国产精品夜夜夜爽张柏芝| 国产aa精品| 久久理论片午夜琪琪电影网| 天堂网在线观看视频| 欧美日韩在线第一页| 91激情视频在线观看| 乱一区二区av| 欧美日韩午夜爽爽| 久久免费视频66| 日韩女在线观看| 色开心亚洲综合| 日韩视频一区二区| 91国产丝袜播放在线| 国产亚洲精品中文字幕| 岛国av免费在线| 国产精品jizz在线观看美国| 精品国产一区二区三区麻豆免费观看完整版| 小视频免费在线观看| 一区二区三区精品99久久| 国产精品久久久午夜夜伦鲁鲁| 一区二区高清免费观看影视大全| 波多野结衣有码| 美女爽到高潮91| 成人精品视频在线播放| 欧洲杯足球赛直播| 高清国产一区| 黄色精品视频网站| 午夜精品www| 免费人成在线观看播放视频| 精品成人一区二区三区| 欧美国产一级片| 一级日本不卡的影视| 亚洲国产av一区| 国产91精品欧美| 欧美特级aaa| 亚洲国产专区校园欧美| 亚洲一区二区在线看| 久久视频在线观看| 92看片淫黄大片欧美看国产片| 久久男人av资源站| 久久综合久中文字幕青草| 色婷婷av一区二区三区之红樱桃| 欧美日韩aaaaaa| xxxx.国产| 一区二区三区在线观看动漫| 久久久视频6r| eeuss影院一区二区三区| 婷婷中文字幕在线观看| 久久一本综合频道| 免费拍拍拍网站| 亚洲成人av| 日韩精品一区二区三区外面 | 日韩中文不卡| 日韩美女精品| 成人av蜜桃| 亚洲视频资源| 国产精品三级网站| a一区二区三区| 97色在线视频观看| 色爱综合区网| 欧美精品在线免费观看| 五月天婷婷在线视频| 国产亚洲一区二区精品| 视频在线不卡| 亚洲а∨天堂久久精品喷水| 国产成人麻豆精品午夜在线| 欧美日韩黄视频| 日韩乱码一区二区三区| 欧美色视频日本版| 欧美日韩精品区| 黑人巨大精品欧美一区二区三区| 欧美久久久久久久久久久久| 亚洲欧美日韩久久| 一级片一级片一级片| 一色屋精品亚洲香蕉网站| 国产在线免费av| 中文字幕av一区二区三区高| 免费看91的网站| 国产精品色婷婷久久58| 亚洲午夜精品久久久久久高潮| 久久久精品日韩欧美| 97超碰在线资源| 久久久久久免费网| 免费一级黄色录像| 成人免费一区二区三区视频 | 欧美亚洲综合久久| 亚洲精品无码久久久久| 欧美在线看片a免费观看| 香蕉污视频在线观看| 欧美影视一区在线| 中文字幕一区二区免费| 91精品国产乱码| 成人黄色免费视频| 亚洲国产欧美日韩精品| 免费毛片在线| 中文字幕无线精品亚洲乱码一区 | 头脑特工队2在线播放| 日韩的一区二区| 国产高清一级毛片在线不卡| 中文字幕视频一区二区在线有码| 黄a在线观看| 欧美精品精品精品精品免费| 91桃色在线| 日韩暖暖在线视频| 亚洲青青一区| 国产欧美亚洲日本| 国产成人一区| 麻豆中文字幕在线观看| 午夜免费一区二区| 亚洲激情视频| 日韩精品无码一区二区三区免费| 男人操女人的视频在线观看欧美| 91热视频在线观看| 成人午夜在线视频| 欧美日韩高清丝袜| 亚洲日本va在线观看| www.天天色| 日本国产一区二区| 精品国产999久久久免费| 亚洲国产中文字幕在线观看| 电影av一区| 久久中文字幕在线| 台湾佬中文娱乐网欧美电影| 国产欧美一区二区三区在线 | 亚洲综合不卡| 国产一伦一伦一伦| 成人免费高清在线观看| 日韩欧美黄色网址| 亚洲一区二区三区四区五区中文| 国产成人无码一区二区在线播放| 在线播放欧美女士性生活| 亚洲成人77777| 亚洲系列中文字幕| 污污的网站在线看| 国产精品户外野外| 国产精品毛片av| 一区二区三区三区在线| 99精品国产99久久久久久福利| 亚洲免费成人在线视频| 91社区在线播放| 久久久久99精品成人片试看| 91成人在线免费观看| 亚洲AV无码一区二区三区性| 伊是香蕉大人久久| 9999热视频在线观看| 国产在线一区二区三区| 亚洲另类av| 69sex久久精品国产麻豆| 韩国三级电影一区二区| 在线不卡av电影| 午夜视频一区在线观看| 国产毛片毛片毛片毛片| 亚洲夜晚福利在线观看| 白浆视频在线观看| 91精品国自产在线观看 | 波多野结衣一区二区三区| 日韩精品久久久久久久的张开腿让| 欧美午夜激情在线| 亚洲精品久久久久久久久久久久久久| 日韩在线欧美在线| 成人影院网站| 精品无人区一区二区三区 | 高清在线视频日韩欧美| 国产亚洲久久| 伊人久久婷婷色综合98网| 日韩精品乱码av一区二区| 日本aaa视频| 精品magnet| 性感美女一级片| 97精品久久久中文字幕免费| 亚洲精品一区二区三区在线| av电影一区二区三区| 国产在线精品一区二区不卡了 | 香蕉成人啪国产精品视频综合网| av中文字幕免费| 久久国产精品久久精品| 国产色99精品9i| 99热都是精品| 国产一区在线精品| 国产高潮国产高潮久久久91| 91精品国产一区二区三区蜜臀| 免费**毛片在线| 91精品视频专区| 一个色综合网| 中文字幕1区2区| 亚洲成人av电影在线| 无码国产精品一区二区色情男同 | eeuss鲁片一区二区三区在线观看| 久草视频在线资源站| 亚洲成人av在线| 一区二区精品伦理...| 欧美日韩一区综合| 日韩不卡一区二区| 国产一区二区三区四区在线| 欧美日韩久久久久| 男人的天堂在线| 国产精品一区二区3区| 国产精品99久久| 91亚洲精品久久久蜜桃借种| 亚洲激情网站免费观看| 六月丁香色婷婷| 国产99久久精品一区二区永久免费 | 亚洲 欧美 中文字幕| 一区二区中文字幕| 国产精品日韩精品在线播放 | 精品一区二区三区在线视频| 少妇aaaaa| 亚洲激情电影中文字幕| 性欧美freehd18| 六月婷婷激情网| 91亚洲永久精品| 在线观看国产小视频| 久久6免费高清热精品| 色婷婷综合久久久久久| jizz18女人| 亚洲香蕉伊在人在线观| 日本亚洲一区| 成人免费网站在线观看| 亚洲人成人一区二区三区| 一卡二卡三卡四卡| 91精品国产欧美一区二区18| 欧产日产国产精品视频| 婷婷久久青草热一区二区 | 欧美综合亚洲图片综合区| 在线h片观看| 欧美激情论坛| 国产高清亚洲一区| 国产91精品看黄网站在线观看| 俺去了亚洲欧美日韩| 色婷婷精品视频| 先锋资源在线视频| 在线观看亚洲精品视频| 污视频在线免费观看网站| 日本一区视频在线| 成人av在线资源|