精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日本不卡一二三区黄网| gogo高清在线播放免费| 蜜桃视频在线观看一区| 九九热精品视频国产| 亚洲av网址在线| 国产精品久久久久久吹潮| 亚洲人妖av一区二区| 国语精品免费视频| 一区二区三区精| 国产精品综合色区在线观看| 日韩在线欧美在线| 日本一区二区在线免费观看| 黄色日韩网站| 黑人巨大精品欧美一区二区| a级网站在线观看| 日本啊v在线| 丁香天五香天堂综合| 国产精品自产拍在线观看| 欧美福利视频一区二区| 精品欧美在线观看| 久久久久伊人| 五月婷婷色综合| 这里只有精品66| 黄色国产在线| 暴力调教一区二区三区| 成人在线国产精品| 久久经典综合| 精品1区2区在线观看| 99视频精品免费| 92久久精品| 亚洲女人被黑人巨大进入al| 国产成人精品免费看在线播放 | 午夜精品成人在线| 久久最新免费视频| 香蕉视频免费在线播放| 久久久精品人体av艺术| 国产一级一片免费播放| 日韩深夜视频| 亚洲人xxxx| 亚洲草草视频| 男人av在线| 91美女精品福利| 国产伦精品一区二区三区高清| 国产一区二区小视频| 日韩国产欧美在线观看| 日产精品99久久久久久| 五月婷婷中文字幕| 一本综合精品| 91超碰中文字幕久久精品| 劲爆欧美第一页| 综合久久婷婷| 蜜臀久久99精品久久久久久宅男 | 日本r级电影在线观看| 国产精品诱惑| 91精品国产一区二区三区蜜臀| 亚洲 欧美 日韩系列| 国产精品天堂蜜av在线播放 | 精人妻一区二区三区| 日本少妇精品亚洲第一区| 日韩一区二区免费视频| 美国黄色一级视频| 精品欠久久久中文字幕加勒比| www.欧美.com| 91在线高清视频| 国产女人高潮时对白| 国产一区二区三区香蕉| 97视频资源在线观看| 成人爽a毛片一区二区| 成人avav影音| 欧美日韩在线一二三| 国产精品毛片一区二区三区四区| 欧美国产精品一区二区三区| 一本色道久久99精品综合| 永久免费av片在线观看全网站| 国产精品久久免费看| 日韩人妻一区二区三区蜜桃视频| 亚洲精品天堂| 欧美性极品xxxx娇小| 欧美变态另类刺激| www天堂在线| 欧美区国产区| 久久久之久亚州精品露出| 亚洲精品不卡| 久久国产在线视频| 欧美精品网站| 97视频免费在线看| 丁香色欲久久久久久综合网| 黄色网页在线观看| 亚洲一卡二卡三卡四卡| 亚洲 高清 成人 动漫| 国产在线|日韩| 日韩一级成人av| 性欧美成人播放77777| 日韩av自拍| 欧美精品激情在线观看| 日本久久综合网| 久久精品国产精品亚洲红杏| 国产成人精品日本亚洲11 | 在线丝袜欧美日韩制服| 18video性欧美19sex高清| 色av综合在线| 欧美性受xxxx黑人猛交88| 国产高清在线a视频大全| 色综合天天综合狠狠| 欧美特级aaa| 美女视频亚洲色图| 日韩视频免费观看| 在线观看亚洲欧美| gogo在线观看| 亚洲综合久久av| 116极品美女午夜一级| 99国产精品一区二区三区| 成人综合在线网站| 日韩欧美电影一区二区| 国产天堂在线播放视频| 欧美日韩精品欧美日韩精品 | 久久艹免费视频| 三级不卡在线观看| 国产精品久久一区二区三区| 最近高清中文在线字幕在线观看| 午夜视频一区二区三区| 天堂网成人在线| 欧美午夜精彩| 欧洲一区二区视频| 乱色精品无码一区二区国产盗| 国产精品久久久久久久第一福利| 蜜臀av午夜一区二区三区| 日韩在线精品强乱中文字幕| 日韩性xxxx爱| 一级久久久久久| 久久久亚洲午夜电影| 青青青青草视频| 亚洲天堂av资源在线观看| www.国产精品一二区| 国产熟妇一区二区三区四区| 93久久精品日日躁夜夜躁欧美| 天堂8在线天堂资源bt| 欧美极品欧美精品欧美| 免费观看日批视频| 国产乱码精品一区二区三| 视频一区二区三区在线观看| 亚洲一级少妇| 亚洲精品乱码久久久久久金桔影视| 人与嘼交av免费| 日韩av字幕| 色综合视频网站| av一级黄色片| 亚洲欧美乱综合| 污污网站在线观看视频| 日本一区二区免费高清| 国产精品电影一区| 国内精品国产三级国产a久久 | 日韩人妻无码一区二区三区| 一本综合精品| 欧美不卡福利| 欧美va在线观看| 国产一级揄自揄精品视频| 亚洲av无码不卡| 中文无字幕一区二区三区| 国产一级片自拍| 欧美在线不卡| 不卡视频一区二区三区| 91九色在线看| 精品在线欧美视频| 午夜视频网站在线观看| 中文字幕一区二区三区四区 | 欧美一区在线观看视频| 欧美激情一二区| 亚洲人成色777777老人头| 一本大道久久a久久综合| 女人黄色一级片| 狠狠色丁香婷婷综合久久片| 2022中文字幕| 欧美日韩夜夜| 国产精自产拍久久久久久蜜| 黄色在线免费| 亚洲第一视频网站| 无码人妻精品一区二区三区9厂 | 日韩欧美国产免费| 欧美精品色图| 91久久精品一区| 蜜桃视频在线观看播放| 色阁综合伊人av| www.国产免费| 在线视频你懂得一区| 欧美成人精品欧美一级| 久久久久久久久久久久久夜| 亚洲av无日韩毛片久久| 亚洲经典自拍| 亚洲视频欧美在线| 久草精品视频| 91精品在线观| 9i看片成人免费高清| 色偷偷9999www| 午夜福利一区二区三区| 欧美日韩国产一级片| 日韩欧美激情视频| 中文字幕在线免费不卡| aa片在线观看视频在线播放| 国精产品一区一区三区mba视频| 缅甸午夜性猛交xxxx| 国产精品久久久久久久久久10秀| 精品日韩电影| 日韩激情精品| 国产日韩精品入口| 日本不良网站在线观看| 久久国产精品影视| 黄色电影免费在线看| 欧美一级片在线看| 国产一卡二卡三卡| 天天综合天天做天天综合| 岛国毛片在线观看| 欧美激情一二三区| 男生裸体视频网站| 国产91精品露脸国语对白| 老司机午夜性大片| 天堂中文在线官网| caoporn国产精品| 色一情一区二区| 亚洲一区成人| 男人添女荫道口女人有什么感觉| 日韩欧美伦理| 欧美午夜精品理论片a级大开眼界| 中文字幕一区日韩精品 | 一区二区三区日本视频| 日韩女优在线播放| 漫画在线观看av| 色综合久久久久久中文网| 麻豆系列在线观看| 丝袜美腿精品国产二区| 91社区在线观看播放| 亚洲一级免费视频| 女人偷人在线视频| 精品视频一区在线视频| 欧美熟妇交换久久久久久分类| 91麻豆精品国产91久久久更新时间| 成人黄色免费网| 色妞www精品视频| 伊人中文字幕在线观看| 欧美日韩中文在线观看| 日本在线播放视频| 色偷偷久久人人79超碰人人澡| 国产污片在线观看| 亚洲成人tv网| 日本三级一区二区| 欧美日韩在线一区| 欧美超碰在线观看| 在线观看欧美日本| 亚洲精品无码久久久久| 欧美网站一区二区| 一级黄色大片免费| 欧美精品1区2区3区| 国产偷拍一区二区| 日韩欧美一区二区免费| 亚洲国产成人一区二区| 精品国产凹凸成av人导航| 精品人妻一区二区三区日产乱码| 精品免费一区二区三区| 人妻一区二区三区四区| 日韩av中文字幕在线免费观看 | www.丝袜精品| 国产在线欧美日韩| 少妇一区二区视频| 在线视频不卡一区二区| 欧美日韩一区二区三区四区在线观看| av网站手机在线观看| 国产精品免费看| 在线观看的毛片| 国产激情精品久久久第一区二区| 精品伦一区二区三区| 久久综合久久综合久久综合| 蜜桃av乱码一区二区三区| 日韩一区在线看| 精品在线视频观看| 91久久香蕉国产日韩欧美9色| 91免费视频播放| 欧美精品一区二区三区蜜桃视频 | 亚洲福利天堂| 一区二区不卡在线观看| 国内精品久久久久久久影视麻豆 | 免费福利视频一区二区三区| 国产精品久久二区| 99久久人爽人人添人人澡| 欧洲一区二区在线| 97视频精品| 黄色网页免费在线观看| 麻豆精品国产91久久久久久| 美女久久久久久久久| 国产欧美日韩一区二区三区在线观看| 欧美在线视频第一页| 欧美日韩中文字幕日韩欧美| 国产乱人乱偷精品视频a人人澡| 亚洲国产另类 国产精品国产免费| 137大胆人体在线观看| 久久人人97超碰精品888| www.国产精品| 久久久精彩视频| 在线观看免费一区二区| 黄色片久久久久| 高清不卡一区二区在线| 极品蜜桃臀肥臀-x88av| 亚洲欧美日韩一区二区三区在线观看| 免费看日韩毛片| 欧美一区二区三区四区久久 | 九九九久久久久久| 欧美色网在线| 国产在线一区二区三区欧美| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 亚洲精品在线播放| 亚洲一区二区三区免费观看| 一本久道久久久| 亚洲精品鲁一鲁一区二区三区| 国产日本欧洲亚洲| 精品不卡一区二区| 精品久久久三级丝袜| 黄色国产网站在线播放| 国产精品狼人色视频一区| 欧美a一欧美| 免费高清一区二区三区| 国产中文字幕精品| 一本色道久久88| 91国产视频在线观看| 亚洲欧美一区二区三| 久久久久久久91| 日本99精品| 99精品视频网站| 九九热在线视频观看这里只有精品| 3d动漫精品啪啪一区二区下载| 亚洲一区在线观看网站| 99精品人妻无码专区在线视频区| 一区二区三欧美| 日韩精品99| 奇米视频888战线精品播放| 亚洲一区二区动漫| 亚洲一区二区观看| 欧美性猛交xxxx富婆| 天堂√在线中文官网在线| 91精品国产高清久久久久久91| 成人av综合网| 免费人成在线观看视频播放| 高清国产午夜精品久久久久久| 精品亚洲永久免费| 亚洲第一精品电影| 国产黄大片在线观看| 精品一区2区三区| 亚洲精品麻豆| 少妇光屁股影院| 一本久道中文字幕精品亚洲嫩| 神马精品久久| 国产xxx69麻豆国语对白| 国产亚洲一区二区三区啪| 老司机午夜av| 国产精品你懂的在线| 91在线公开视频| 欧美乱妇高清无乱码| av一级亚洲| 奇米精品一区二区三区| 国产亚洲美州欧州综合国| 少妇无套内谢久久久久| 久久久精品影院| 精品国产亚洲一区二区三区| 青青青在线观看视频| 成人97人人超碰人人99| 亚洲熟女综合色一区二区三区| 亚洲人在线视频| 日韩大陆av| www.国产在线视频| 久久久.com| 国产视频手机在线| 国精产品一区一区三区有限在线| 天堂av一区二区三区在线播放| 日本999视频| 亚洲激情图片一区| 四虎影视精品成人| 国产精品中文字幕久久久| 午夜日韩在线| 亚洲一区二区观看| 在线不卡欧美精品一区二区三区| 乱插在线www| 日本一区视频在线观看免费| 国产剧情在线观看一区二区| 日本网站在线免费观看| 在线观看国产成人av片| aiss精品大尺度系列| 五月天婷婷激情视频| 亚洲一二三四在线观看| www.成人.com| 高清不卡日本v二区在线| 日韩中文字幕麻豆| 激情综合五月网| 在线观看中文字幕亚洲| 国产精品高潮呻吟久久久久| 一区二区三区国产免费| 亚洲成a人v欧美综合天堂| av在线免费观看网| 国产传媒欧美日韩| 美女视频黄久久| 国产尤物在线视频| 久久不射电影网| 欧美日韩伦理在线免费|