本篇內(nèi)容主要講解“Python有哪些高效率技巧”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python有哪些高效率技巧”吧!
成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比寶山網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式寶山網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋寶山地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴(lài)。
清理字符串輸入
清理用戶(hù)輸入的問(wèn)題,幾乎適用于我們可能編寫(xiě)的每個(gè)程序。通常將字符轉(zhuǎn)換為小寫(xiě)或大寫(xiě)就足夠了,這時(shí)只需要使用正則即可,但是對(duì)于復(fù)雜的情況,有一種更好的方法:
user_input = "This\nstring has\tsome whitespaces...\r\n" character_map = { ord('\n') : ' ', ord('\t') : ' ', ord('\r') : None } user_input.translate(character_map) # This string has some whitespaces... "
在上述示例中,可以看到空格符“ \ n”和“ \ t”已被單個(gè)空格替換,而“ \ r”已被完全刪除。這是一個(gè)簡(jiǎn)單的示例,但是我們可以更進(jìn)一步,使用 unicodedata包及其 combining()函數(shù)生成范圍更廣的映射表,從字符串中刪除所有重音符號(hào)。
迭代器切片
如果您嘗試獲取迭代器的切片,系統(tǒng)會(huì)報(bào) TypeError,提示生成器對(duì)象不可下標(biāo),但是解決方案很簡(jiǎn)單:
import itertools s = itertools.islice(range(50), 10, 20) # <itertools.islice object at 0x7f70fab88138> for val in s: ...
使用 itertools.islice,我們可以創(chuàng)建一個(gè) islice對(duì)象,該對(duì)象是產(chǎn)生所需元素的迭代器。不過(guò),請(qǐng)務(wù)必注意,這會(huì)消耗所有生成器項(xiàng),直到切片開(kāi)始為止,而且還會(huì)消耗我們的“ islice”對(duì)象中的所有項(xiàng)。
Using itertools.islice we can create a islice object which is an iterator that produces desired items. It's important to note though, that this consumes all generator items up until the start of slice and also all the items in our islice object.
跳過(guò)可迭代對(duì)象的開(kāi)始
有時(shí)候需要處理的文件里,明確存在一些不需要的數(shù)據(jù)行,但是我們不確定數(shù)量,比如說(shuō)代碼中的注釋。這時(shí), itertools 再次為我們提供了簡(jiǎn)潔的方案:
string_from_file = """ // Author: ... // License: ... // // Date: ... Actual content... """ import itertools for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("\n")): print(line)
這段代碼僅在初始注釋部分之后,才會(huì)產(chǎn)生數(shù)據(jù)行。如果我們只想在迭代器的開(kāi)頭丟棄數(shù)據(jù),而又不知道有具體數(shù)量時(shí),這個(gè)方法很有用。
僅帶關(guān)鍵字參數(shù)(kwargs)的函數(shù)
有時(shí)候,使用僅支持關(guān)鍵字參數(shù)的函數(shù)可以讓代碼更加清晰易懂:
def test(*, a, b): pass test("value for a", "value for b") # TypeError: test() takes 0 positional arguments... test(a="value", b="value 2") # Works...
只需要在關(guān)鍵字參數(shù)前面再加一個(gè) * 參數(shù),就可以輕松實(shí)現(xiàn)了。當(dāng)然,如果還希望再加上位置參數(shù),可以在 * 參數(shù)前面再增加。
創(chuàng)建支持 with語(yǔ)句的對(duì)象
我們都知道如何打開(kāi)文件或使用 with語(yǔ)句獲取鎖,但是怎樣自己可以實(shí)現(xiàn)類(lèi)似的功能呢?一般來(lái)說(shuō),我們可以使用 __enter__和 __exit__方法來(lái)實(shí)現(xiàn)上下文管理器協(xié)議:
classConnection: def __init__(self): ... def __enter__(self): # Initialize connection... def __exit__(self, type, value, traceback): # Close connection... withConnection() as c: # __enter__() executes ... # conn.__exit__() executes
上面是最常見(jiàn)的實(shí)現(xiàn)方式,但是還有一種更簡(jiǎn)單的方法:
from contextlib import contextmanager @contextmanager def tag(name): print(f"<{name}>") yield print(f"") with tag("h2"): print("This is Title.")
上面的代碼段使用 contextmanager管理器裝飾器實(shí)現(xiàn)了內(nèi)容管理協(xié)議。進(jìn)入“ with”塊時(shí),執(zhí)行“ tag”函數(shù)的第一部分(在“ yield”之前),然后執(zhí)行 yield,最后執(zhí)行其余部分。
用 __slots__節(jié)省內(nèi)存
如果程序需要?jiǎng)?chuàng)建大量的類(lèi)實(shí)例,我們會(huì)發(fā)現(xiàn)程序占用了大量?jī)?nèi)存。這是因?yàn)?Python 使用字典來(lái)表示類(lèi)實(shí)例的屬性,這樣的話(huà)創(chuàng)建速度很快,但是很耗內(nèi)存。如果內(nèi)存是你需要考慮的一個(gè)問(wèn)題,那么可以考慮使用 __slots__:
classPerson: __slots__ = ["first_name", "last_name", "phone"] def __init__(self, first_name, last_name, phone): self.first_name = first_name self.last_name = last_name self.phone = phone
當(dāng)我們定義 __slots__屬性時(shí),Python會(huì)使用固定大小的數(shù)組(占用內(nèi)存少)來(lái)存儲(chǔ)屬性,而不是字典,這大大減少了每個(gè)實(shí)例所需的內(nèi)存。不過(guò)使用 __slots__還有一些缺點(diǎn):無(wú)法聲明任何新屬性,我們只能使用 __slots__中的那些屬性。同樣,帶有 __slots__的類(lèi)不能使用多重繼承。
限制CPU和內(nèi)存使用量
如果不是想優(yōu)化程序內(nèi)存或CPU使用率,而是想直接將其限制為某個(gè)數(shù)值,那么Python也有一個(gè)可以滿(mǎn)足要求的庫(kù):
import signal import resource import os # To Limit CPU time def time_exceeded(signo, frame): print("CPU exceeded...") raiseSystemExit(1) def set_max_runtime(seconds): # Install the signal handler and set a resource limit soft, hard = resource.getrlimit(resource.RLIMIT_CPU) resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard)) signal.signal(signal.SIGXCPU, time_exceeded) # To limit memory usage def set_max_memory(size): soft, hard = resource.getrlimit(resource.RLIMIT_AS) resource.setrlimit(resource.RLIMIT_AS, (size, hard))
在這里,我們可以設(shè)置了最大cpu運(yùn)行時(shí)間以及最大內(nèi)存使用限制的兩個(gè)選項(xiàng)。對(duì)于cpu限制,我們首先獲得該特定資源( RLIMIT_CPU)的軟限制和硬限制,然后使用參數(shù)指定的秒數(shù)和先前獲取的硬限制來(lái)設(shè)置。
最后,我們注冊(cè)了一個(gè)在超過(guò)CPU時(shí)間后,讓系統(tǒng)退出的信號(hào)。至于內(nèi)存,我們?cè)俅潍@取軟限制和硬限制,并使用帶有大小參數(shù)的 setrlimit和硬限制完成配置
控制導(dǎo)入的內(nèi)容
某些語(yǔ)言提供了導(dǎo)出成員(變量,方法,接口)的顯式機(jī)制,例如Golang,它僅導(dǎo)出以大寫(xiě)字母開(kāi)頭的成員。但是在Python中,所有對(duì)象都會(huì)導(dǎo)出,除非我們使用 __all__:
def foo(): pass def bar(): pass __all__ = ["bar"]
上面的代碼段中,只會(huì)導(dǎo)出 bar函數(shù)。另外,如果 __all__的值為空,那么不會(huì)導(dǎo)出任何函數(shù),而且在導(dǎo)入該模塊時(shí)系統(tǒng)會(huì)報(bào) AttributeError。
實(shí)現(xiàn)比較運(yùn)算符
如果我們要逐一為某個(gè)類(lèi)實(shí)現(xiàn)所有的比較運(yùn)算符,你肯定會(huì)覺(jué)得很麻煩,因?yàn)橐獙?shí)現(xiàn)的方法還不少,有 __lt__,__le__,__gt__, 和 __ge__。
其實(shí),Python 提供了一種便捷的實(shí)現(xiàn)方式,就是通過(guò) functools.total_ordering裝飾器。
from functools import total_ordering @total_ordering classNumber: def __init__(self, value): self.value = value def __lt__(self, other): returnself.value < other.value def __eq__(self, other): returnself.value == other.value print(Number(20) > Number(3)) print(Number(1) < Number(5)) print(Number(15) >= Number(15)) print(Number(10) <= Number(2))
這是怎么實(shí)現(xiàn)的呢? total_ordering可以用來(lái)簡(jiǎn)化實(shí)現(xiàn)類(lèi)排序的過(guò)程。我們只需要定義 __lt__和 __eq__(這是映射剩余操作的最低要求),然后就交給裝飾器去完成剩余的工作了。
到此,相信大家對(duì)“Python有哪些高效率技巧”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
新聞標(biāo)題:Python有哪些高效率技巧
新聞來(lái)源:http://muchs.cn/article34/piohse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、品牌網(wǎng)站設(shè)計(jì)、定制網(wǎng)站、網(wǎng)站排名、標(biāo)簽優(yōu)化、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)