你應(yīng)該知道的Python3.6、3.7、3.8新特性小結(jié)
很多人在學(xué)習(xí)了基本的Python語言知識(shí)后,就轉(zhuǎn)入應(yīng)用階段了,后期很少對(duì)語言本身的新變化、新內(nèi)容進(jìn)行跟蹤學(xué)習(xí)和知識(shí)更新,甚至連已經(jīng)發(fā)布了好幾年的Python3.6的新特性都缺乏了解。
本文列舉了Python3.6、3.7、3.8三個(gè)版本的新特性,學(xué)習(xí)它們有助于提高對(duì)Python的了解,跟上最新的潮流。
一、Python3.6新特性
1、新的格式化字符串方式
新的格式化字符串方式,即在普通字符串前添加 f 或 F 前綴,其效果類似于str.format()。比如
name = "red" print(f"He said his name is {name}.") # 'He said his name is red.'
相當(dāng)于:
print("He said his name is {name}.".format(**locals()))
此外,此特性還支持嵌套字段,比如:
import decimal width = 10 precision = 4 value = decimal.Decimal("12.34567") print(f"result: {value:{width}.{precision}}") #'result: 12.35'
2、變量聲明語法
可以像下面一樣聲明一個(gè)變量并指定類型:
from typing import List, Dict primes: List[int] = [] captain: str # 此時(shí)沒有初始值 class Starship: stats: Dict[str, int] = {}
3、數(shù)字的下劃線寫法
允許在數(shù)字中使用下劃線,以提高多位數(shù)字的可讀性。
a = 1_000_000_000_000_000 # 1000000000000000 b = 0x_FF_FF_FF_FF # 4294967295
除此之外,字符串格式化也支持_選項(xiàng),以打印出更易讀的數(shù)字字符串:
'{:_}'.format(1000000) # '1_000_000' '{:_x}'.format(0xFFFFFFFF) # 'ffff_ffff'
4、異步生成器
在Python3.5中,引入了新的語法 async 和 await 來實(shí)現(xiàn)協(xié)同程序。但是有個(gè)限制,不能在同一個(gè)函數(shù)體內(nèi)同時(shí)使用 yield 和 await。Python3.6中,這個(gè)限制被放開了,允許定義異步生成器:
async def ticker(delay, to): """Yield numbers from 0 to *to* every *delay* seconds.""" for i in range(to): yield i await asyncio.sleep(delay)
5、異步解析器
允許在列表list、集合set 和字典dict 解析器中使用 async 或 await 語法。
result = [i async for i in aiter() if i % 2] result = [await fun() for fun in funcs if await condition()]
6、新增加模塊
標(biāo)準(zhǔn)庫(kù)(The Standard Library)中增加了一個(gè)新的模塊:secrets。該模塊用來生成一些安全性更高的隨機(jī)數(shù),用于管理passwords, account authentication, security tokens, 以及related secrets等數(shù)據(jù)。
7、其他新特性
- 新的 PYTHONMALLOC 環(huán)境變量允許開發(fā)者設(shè)置內(nèi)存分配器,以及注冊(cè)debug鉤子等。
- asyncio模塊更加穩(wěn)定、高效,并且不再是臨時(shí)模塊,其中的API也都是穩(wěn)定版的了。
- typing模塊也有了一定改進(jìn),并且不再是臨時(shí)模塊。
- datetime.strftime 和 date.strftime 開始支持ISO 8601的時(shí)間標(biāo)識(shí)符%G, %u, %V。
- hashlib 和 ssl 模塊開始支持OpenSSL1.1.0。
- hashlib模塊開始支持新的hash算法,比如BLAKE2, SHA-3 和 SHAKE。
- Windows上的 filesystem 和 console 默認(rèn)編碼改為UTF-8。
- json模塊中的 json.load() 和 json.loads() 函數(shù)開始支持 binary 類型輸入。
二、Python3.7新特性
Python 3.7于2018年6月27日發(fā)布, 包含許多新特性和優(yōu)化,增添了眾多新的類,可用于數(shù)據(jù)處理、針對(duì)腳本編譯和垃圾收集的優(yōu)化以及更快的異步I/O,主要如下:
- 用類處理數(shù)據(jù)時(shí)減少樣板代碼的數(shù)據(jù)類。
- 一處可能無法向后兼容的變更涉及處理生成器中的異常。
- 面向解釋器的“開發(fā)模式”。
- 具有納秒分辨率的時(shí)間對(duì)象。
- 環(huán)境中默認(rèn)使用UTF-8編碼的UTF-8模式。
- 觸發(fā)調(diào)試器的一個(gè)新的內(nèi)置函數(shù)。
1、新增內(nèi)置函數(shù)breakpoint()
使用該內(nèi)置函數(shù),相當(dāng)于通過代碼的方式設(shè)置了斷點(diǎn),會(huì)自動(dòng)進(jìn)入Pbd調(diào)試模式。
如果在環(huán)境變量中設(shè)置PYTHONBREAKPOINT=0會(huì)忽略此函數(shù)。并且,pdb 只是眾多可用調(diào)試器之一,你可以通過設(shè)置新的 PYTHONBREAKPOINT 環(huán)境變量來配置想要使用的調(diào)試器。
下面有一個(gè)簡(jiǎn)單例子,用戶需要輸入一個(gè)數(shù)字,判斷它是否和目標(biāo)數(shù)字一樣:
"""猜數(shù)字游戲""" def guess(target): user_guess = input("請(qǐng)輸入你猜的數(shù) >>> ") if user_guess == target: return "你猜對(duì)了!" else: return "猜錯(cuò)了" if __name__ == '__main__': a = 100 print(guess(a))
不幸的是,即使猜的數(shù)和目標(biāo)數(shù)一樣,打印的結(jié)果也是‘猜錯(cuò)了',并且沒有任何異?;蝈e(cuò)誤信息。
為了弄清楚發(fā)生了什么,我們可以插入一個(gè)斷點(diǎn),來調(diào)試一下。以往一般通過print大法或者IDE的調(diào)試工具,但現(xiàn)在我們可以使用 breakpoint()。
"""猜數(shù)字游戲""" def guess(target): user_guess = input("請(qǐng)輸入你猜的數(shù) >>> ") breakpoint() //加入這一行 if user_guess == target: return "你猜對(duì)了!" else: return "猜錯(cuò)了" if __name__ == '__main__': a = 100 print(guess(a))
在 pdb 提示符下,我們可以調(diào)用 locals() 來查看當(dāng)前的本地作用域的所有變量。(pdb 有大量的命令,你也可以在其中運(yùn)行正常的Python 語句)
請(qǐng)輸入你猜的數(shù) >>> 100 > d:\work\for_test\py3_test\test.py(7)guess() -> if user_guess == target: (Pdb) locals() {'target': 100, 'user_guess': '100'} (Pdb) type(user_guess) <class 'str'>
搞明白了,target是一個(gè)整數(shù),而user_guess 是一個(gè)字符串,這里發(fā)生了類型對(duì)比錯(cuò)誤。
2、類型和注解
從 Python 3.5 開始,類型注解就越來越受歡迎。對(duì)于那些不熟悉類型提示的人來說,這是一種完全可選的注釋代碼的方式,以指定變量的類型。
什么是注解?它們是關(guān)聯(lián)元數(shù)據(jù)與變量的語法支持,可以是任意表達(dá)式,在運(yùn)行時(shí)被 Python 計(jì)算但被忽略。注解可以是任何有效的 Python 表達(dá)式。
下面是個(gè)對(duì)比的例子:
# 不帶類型注解 def foo(bar, baz): # 帶類型注解 def foo(bar: 'Describe the bar', baz: print('random')) -> 'return thingy':
上面的做法,其實(shí)是Python對(duì)自身弱類型語言的強(qiáng)化,希望獲得一定的類型可靠和健壯度,向Java等語言靠攏。
在 Python 3.5 中,注解的語法獲得標(biāo)準(zhǔn)化,此后,Python 社區(qū)廣泛使用了注解類型提示。
但是,注解僅僅是一種開發(fā)工具,可以使用 PyCharm 等 IDE 或 Mypy 等第三方工具進(jìn)行檢查,并不是語法層面的限制。
我們前面的猜數(shù)程序如果添加類型注解,它應(yīng)該是這樣的:
"""猜數(shù)字游戲""" def guess(target:str): user_guess:str = input("請(qǐng)輸入你猜的數(shù) >>> ") breakpoint() if user_guess == target: return "你猜對(duì)了!" else: return "猜錯(cuò)了" if __name__ == '__main__': a:int = 100 print(guess(a))
PyCharm會(huì)給我們灰色的規(guī)范錯(cuò)誤提醒,但不會(huì)給紅色的語法錯(cuò)誤提示。
用注解作為類型提示時(shí),有兩個(gè)主要問題:?jiǎn)?dòng)性能和前向引用。
- 在定義時(shí)計(jì)算大量任意表達(dá)式相當(dāng)影響啟動(dòng)性能,而且 typing 模塊非常慢
- 你不能用尚未聲明的類型來注解
typing 模塊如此緩慢的部分原因是,最初的設(shè)計(jì)目標(biāo)是在不修改核心 CPython 解釋器的情況下實(shí)現(xiàn) typing 模塊。隨著類型提示變得越來越流行,這一限制已經(jīng)被移除,這意味著現(xiàn)在有了對(duì) typing 的核心支持。
而對(duì)于向前引用,看下面的例子:
class User: def __init__(self, name: str, prev_user: User) -> None: pass
錯(cuò)誤在于 User類型還沒有被聲明,此時(shí)的 prev_user 不能定義為 User 類型。
為了解決這個(gè)問題,Python3.7 將注解的評(píng)估進(jìn)行了推遲。并且,這項(xiàng)改動(dòng)向后不兼容,需要先導(dǎo)入annotations,只有到Python 4.0后才會(huì)成為默認(rèn)行為。
from __future__ import annotations class User: def __init__(self, name: str, prev_user: User) -> None: pass
或者如下面的例子:
class C: def validate_b(self, obj: B) -> bool: ... class B: ...
3、新增dataclasses模塊
這個(gè)特性可能是 Python3.7以后比較常用的,它有什么作用呢?
假如我們需要編寫一個(gè)下面的類:
from datetime import datetime import dateutil class Article(object): def __init__(self, _id, author_id, title, text, tags=None, created=datetime.now(), edited=datetime.now()): self._id = _id self.author_id = author_id self.title = title self.text = text self.tags = list() if tags is None else tags self.created = created self.edited = edited if type(self.created) is str: self.created = dateutil.parser.parse(self.created) if type(self.edited) is str: self.edited = dateutil.parser.parse(self.edited) def __eq__(self, other): if not isinstance(other, self.__class__): return NotImplemented return (self._id, self.author_id) == (other._id, other.author_id) def __lt__(self, other): if not isinstance(other, self.__class__): return NotImplemented return (self._id, self.author_id) < (other._id, other.author_id) def __repr__(self): return '{}(id={}, author_id={}, title={})'.format( self.__class__.__name__, self._id, self.author_id, self.title)
大量的初始化屬性要定義默認(rèn)值,可能還需要重寫一堆魔法方法,來實(shí)現(xiàn)類實(shí)例的打印、比較、排序和去重等功能。
如果使用dataclasses進(jìn)行改造,可以寫成這個(gè)樣子:
from dataclasses import dataclass, field from typing import List from datetime import datetime import dateutil @dataclass(order=True) //注意這里 class Article(object): _id: int author_id: int title: str = field(compare=False) text: str = field(repr=False, compare=False) tags: List[str] = field(default=list(), repr=False, compare=False) created: datetime = field(default=datetime.now(), repr=False, compare=False) edited: datetime = field(default=datetime.now(), repr=False, compare=False) def __post_init__(self): if type(self.created) is str: self.created = dateutil.parser.parse(self.created) if type(self.edited) is str: self.edited = dateutil.parser.parse(self.edited)
這使得類不僅容易設(shè)置,而且當(dāng)我們創(chuàng)建一個(gè)實(shí)例并打印出來時(shí),它還可以自動(dòng)生成優(yōu)美的字符串。在與其他類實(shí)例進(jìn)行比較時(shí),它也會(huì)有適當(dāng)?shù)男袨?。這是因?yàn)閐ataclasses除了幫我們自動(dòng)生成 __init__ 方法外,還生成了一些其他特殊方法,如 repr、eq 和 hash 等。
Dataclasses 使用字段 field來完提供默認(rèn)值,手動(dòng)構(gòu)造一個(gè) field() 函數(shù)能夠訪問其他選項(xiàng),從而更改默認(rèn)值。例如,這里將 field 中的 default_factory 設(shè)置為一個(gè) lambda 函數(shù),該函數(shù)提示用戶輸入其名稱。
from dataclasses import dataclass, field class User: name: str = field(default_factory=lambda: input("enter name"))
4、生成器異常處理
在Python 3.7中,生成器引發(fā)StopIteration異常后,StopIteration異常將被轉(zhuǎn)換成RuntimeError異常,那樣它不會(huì)悄悄一路影響應(yīng)用程序的堆棧框架。這意味著如何處理生成器的行為方面不太敏銳的一些程序會(huì)在Python 3.7中拋出RuntimeError。在Python 3.6中,這種行為生成一個(gè)棄用警告;在Python 3.7中,它將生成一個(gè)完整的錯(cuò)誤。
一個(gè)簡(jiǎn)易的方法是使用try/except代碼段,在StopIteration傳播到生成器的外面捕獲它。更好的解決方案是重新考慮如何構(gòu)建生成器――比如說,使用return語句來終止生成器,而不是手動(dòng)引發(fā)StopIteration。
5、開發(fā)模式
Python解釋器添加了一個(gè)新的命令行開關(guān):-X,讓開發(fā)人員可以為解釋器設(shè)置許多低級(jí)選項(xiàng)。
這種運(yùn)行時(shí)的檢查機(jī)制通常對(duì)性能有重大影響,但在調(diào)試過程中對(duì)開發(fā)人員很有用。
-X 激活的選項(xiàng)包括:
- asyncio模塊的調(diào)試模式。這為異步操作提供了更詳細(xì)的日志記錄和異常處理,而異常操作可能很難調(diào)試或推理。
- 面向內(nèi)存分配器的調(diào)試鉤子。這對(duì)于編寫CPython擴(kuò)展件的那些人很有用。它能夠?qū)崿F(xiàn)更明確的運(yùn)行時(shí)檢查,了解CPython如何在內(nèi)部分配內(nèi)存和釋放內(nèi)存。
- 啟用faulthandler模塊,那樣發(fā)生崩潰后,traceback始終轉(zhuǎn)儲(chǔ)出去。
6、 高精度時(shí)間函數(shù)
Python 3.7中一類新的時(shí)間函數(shù)返回納秒精度的時(shí)間值。盡管Python是一種解釋型語言,但是Python的核心開發(fā)人員維克多•斯廷納(Victor Stinner)主張報(bào)告納秒精度的時(shí)間。最主要的原因是,在處理轉(zhuǎn)換其他程序(比如數(shù)據(jù)庫(kù))記錄的時(shí)間值時(shí),可以避免丟失精度。
新的時(shí)間函數(shù)使用后綴_ns。比如說,time.process_time()的納秒版本是time.process_time_ns()。請(qǐng)注意,并非所有的時(shí)間函數(shù)都有對(duì)應(yīng)的納秒版本。
7、其他新特性
- 字典現(xiàn)在保持插入順序。這在 3.6 中是非正式的,但現(xiàn)在成為了官方語言規(guī)范。在大多數(shù)情況下,普通的 dict 能夠替換 collections.OrderedDict。
- .pyc 文件具有確定性,支持可重復(fù)構(gòu)建 —— 也就是說,總是為相同的輸入文件生成相同的 byte-for-byte 輸出。
- 新增contextvars模塊,針對(duì)異步任務(wù)提供上下文變量。
- __main__中的代碼會(huì)顯示棄用警告(DeprecationWarning)。
- 新增UTF-8模式。在Linux/Unix系統(tǒng),將忽略系統(tǒng)的locale,使用UTF-8作為默認(rèn)編碼。在非Linux/Unix系統(tǒng),需要使用-X utf8選項(xiàng)啟用UTF-8模式。
- 允許模塊定義__getattr__、__dir__函數(shù),為棄用警告、延遲import子模塊等提供便利。
- 新的線程本地存儲(chǔ)C語言API。
- 更新Unicode數(shù)據(jù)到11.0。
三、Python3.8新特性
Python3.8版本于2019年10月14日發(fā)布,以下是 Python 3.8 相比 3.7 的新增特性。
1、海象賦值表達(dá)式
新的語法 :=,將值賦給一個(gè)更大的表達(dá)式中的變量。它被親切地稱為 “海象運(yùn)算符”(walrus operator),因?yàn)樗L(zhǎng)得像海象的眼睛和象牙。
“海象運(yùn)算符” 在某些時(shí)候可以讓你的代碼更整潔,比如:
在下面的示例中,賦值表達(dá)式可以避免調(diào)用 len () 兩次:
if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")
類似的好處還可體現(xiàn)在正則表達(dá)式匹配中需要使用兩次匹配對(duì)象的情況中,一次檢測(cè)用于匹配是否發(fā)生,另一次用于提取子分組:
discount = 0.0 if (mo := re.search(r'(\d+)% discount', advertisement)): discount = float(mo.group(1)) / 100.0
此運(yùn)算符也可用于配合 while 循環(huán)計(jì)算一個(gè)值,來檢測(cè)循環(huán)是否終止,而同一個(gè)值又在循環(huán)體中再次被使用的情況:
# Loop over fixed length blocks while (block := f.read(256)) != '': process(block)
或者出現(xiàn)于列表推導(dǎo)式中,在篩選條件中計(jì)算一個(gè)值,而同一個(gè)值又在表達(dá)式中需要被使用:
[clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]
請(qǐng)盡量將海象運(yùn)算符的使用限制在清晰的場(chǎng)合中,以降低復(fù)雜性并提升可讀性。
2、僅限位置形參
新增一個(gè)函數(shù)形參語法 / 用來指明某些函數(shù)形參必須使用僅限位置而非關(guān)鍵字參數(shù)的形式。
這種標(biāo)記語法與通過 help () 所顯示的使用 Larry Hastings 的 Argument Clinic 工具標(biāo)記的 C 函數(shù)相同。
在下面的例子中,形參 a 和 b 為僅限位置形參,c 或 d 可以是位置形參或關(guān)鍵字形參,而 e 或 f 要求為關(guān)鍵字形參:
def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f)
以下是合法的調(diào)用:
f(10, 20, 30, d=40, e=50, f=60)
但是,以下均為不合法的調(diào)用:
f(10, b=20, c=30, d=40, e=50, f=60) # b 不可以是一個(gè)關(guān)鍵字參數(shù) f(10, 20, 30, 40, 50, f=60) # e 必須是一個(gè)關(guān)鍵字參數(shù)
這種標(biāo)記形式的一個(gè)用例是它允許純 Python 函數(shù)完整模擬現(xiàn)有的用 C 代碼編寫的函數(shù)的行為。例如,內(nèi)置的 pow () 函數(shù)不接受關(guān)鍵字參數(shù):
def pow(x, y, z=None, /): "Emulate the built in pow() function" r = x ** y return r if z is None else r%z
另一個(gè)用例是在不需要形參名稱時(shí)排除關(guān)鍵字參數(shù)。例如,內(nèi)置的 len () 函數(shù)的簽名為 len (obj, /)。這可以排除如下這種笨拙的調(diào)用形式:
len(obj='hello') # The "obj" keyword argument impairs readability
另一個(gè)益處是將形參標(biāo)記為僅限位置形參將允許在未來修改形參名而不會(huì)破壞客戶的代碼。例如,在 statistics 模塊中,形參名 dist 在未來可能被修改。這使得以下函數(shù)描述成為可能:
def quantiles(dist, /, *, n=4, method='exclusive') ...
由于在 / 左側(cè)的形參不會(huì)被公開為可用關(guān)鍵字,其他形參名仍可在 **kwargs 中使用:
>>> def f(a, b, /, **kwargs): ... print(a, b, kwargs) ... >>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways 10 20 {'a': 1, 'b': 2, 'c': 3}
這極大地簡(jiǎn)化了需要接受任意關(guān)鍵字參數(shù)的函數(shù)和方法的實(shí)現(xiàn)。例如,下面是 collections 模塊中的代碼摘錄:
class Counter(dict): def __init__(self, iterable=None, /, **kwds): # Note "iterable" is a possible keyword argument
3、f 字符串支持 =
增加 = 說明符用于 f-string。形式為 f'{expr=}' 的 f 字符串將擴(kuò)展表示為表達(dá)式文本,加一個(gè)等于號(hào),再加表達(dá)式的求值結(jié)果。例如:
>>> user = 'eric_idle' >>> member_since = date(1975, 7, 31) >>> f'{user=} {member_since=}' "user='eric_idle' member_since=datetime.date(1975, 7, 31)" f 字符串格式說明符允許更細(xì)致地控制所要顯示的表達(dá)式結(jié)果: >>> delta = date.today() - member_since >>> f'{user=!s} {delta.days=:,d}' 'user=eric_idle delta.days=16,075' = 說明符將輸出整個(gè)表達(dá)式,以便詳細(xì)演示計(jì)算過程: >>> print(f'{theta=} {cos(radians(theta))=:.3f}') theta=30 cos(radians(theta))=0.866
4、 typing模塊的改進(jìn)
Python是動(dòng)態(tài)類型語言,但可以通過typing模塊添加類型提示,以便第三方工具驗(yàn)證Python代碼。Python 3.8給typing添加了一些新元素,因此它能夠支持更健壯的檢查:
- final修飾器和Final類型標(biāo)注表明,被修飾或被標(biāo)注的對(duì)象在任何時(shí)候都不應(yīng)該被重寫、繼承,也不能被重新賦值。
- Literal類型將表達(dá)式限定為特定的值或值的列表(不一定是同一個(gè)類型的值)。
- TypedDict可以用來創(chuàng)建字典,其特定鍵的值被限制在一個(gè)或多個(gè)類型上。注意這些限制僅用于編譯時(shí)確定值的合法性,而不能在運(yùn)行時(shí)進(jìn)行限制。
5、多進(jìn)程共享內(nèi)存
multiprocessing模塊新增SharedMemory類,可以在不同的Python進(jìn)城之間創(chuàng)建共享的內(nèi)存區(qū)域。
在舊版本的Python中,進(jìn)程間共享數(shù)據(jù)只能通過寫入文件、通過網(wǎng)絡(luò)套接字發(fā)送,或采用Python的pickle模塊進(jìn)行序列化等方式。共享內(nèi)存提供了進(jìn)程間傳遞數(shù)據(jù)的更快的方式,從而使得Python的多處理器和多內(nèi)核編程更有效率。
共享內(nèi)存片段可以作為單純的字節(jié)區(qū)域來分配,也可以作為不可修改的類似于列表的對(duì)象來分配,其中能保存數(shù)字類型、字符串、字節(jié)對(duì)象、None對(duì)象等一小部分Python對(duì)象。
6、 新版本的pickle協(xié)議
Python的pickle模塊提供了一種序列化和反序列化Python數(shù)據(jù)結(jié)構(gòu)或?qū)嵗姆椒?,可以將字典原樣保存下來供以后讀取。不同版本的Python支持的pickle協(xié)議不同,而3.8版本的支持范圍更廣、更強(qiáng)大、更有效的序列化。
Python 3.8引入的第5版pickle協(xié)議可以用一種新方法pickle對(duì)象,它能支持Python的緩沖區(qū)協(xié)議,如bytes、memoryviews或Numpy array等。新的pickle避免了許多在pickle這些對(duì)象時(shí)的內(nèi)存復(fù)制操作。
NumPy、Apache Arrow等外部庫(kù)在各自的Python綁定中支持新的pickle協(xié)議。新的pickle也可以作為Python 3.6和3.7的插件使用,可以從PyPI上安裝。
7、性能改進(jìn)
- 許多內(nèi)置方法和函數(shù)的速度都提高了20%~50%,因?yàn)橹霸S多函數(shù)都需要進(jìn)行不必要的參數(shù)轉(zhuǎn)換。
- 一個(gè)新的opcode緩存可以提高解釋器中特定指令的速度。但是,目前實(shí)現(xiàn)了速度改進(jìn)的只有LOAD_GLOBAL opcode,其速度提高了40%。以后的版本中也會(huì)進(jìn)行類似的優(yōu)化。
- 文件復(fù)制操作如shutil.copyfile()和shutil.copytree()現(xiàn)在使用平臺(tái)特定的調(diào)用和其他優(yōu)化措施,來提高操作速度。
- 新創(chuàng)建的列表現(xiàn)在平均比以前小了12%,這要?dú)w功于列表構(gòu)造函數(shù)如果能提前知道列表長(zhǎng)度的情況下,可以進(jìn)行優(yōu)化。
- Python 3.8中向新型類(如class A(object))的類變量中的寫入操作變得更快。operator.itemgetter()和collections.namedtuple()也得到了速度優(yōu)化。
更多詳細(xì)特性,請(qǐng)查閱Python 3.8.0文檔:https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html
到此這篇關(guān)于你應(yīng)該知道的Python3.6、3.7、3.8新特性小結(jié)的文章就介紹到這了,更多相關(guān)Python3.6、3.7、3.8新特性 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3爬蟲里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn)詳解
在本篇文章里小編給大家分享了關(guān)于Python3爬蟲里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn),有興趣的朋友們可以參考下。2020-07-07Python使用docx模塊實(shí)現(xiàn)刷題功能代碼
今天小編就為大家分享一篇Python使用docx模塊實(shí)現(xiàn)刷題功能代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02Streamlit+Echarts實(shí)現(xiàn)繪制精美圖表
在數(shù)據(jù)分析和可視化的領(lǐng)域,選擇合適的工具可以讓我們事半功倍,本文主要為大家介紹兩個(gè)工具,Streamlit和ECharts,感興趣的小伙伴可以跟隨小編一起了解下2023-09-09OpenCV 表盤指針自動(dòng)讀數(shù)的示例代碼
這篇文章主要介紹了OpenCV 表盤指針自動(dòng)讀數(shù)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04