包含python3ttlcache的詞條

本文目錄一覽:

python3怎麼導入re模塊

Python除了 str 對象自帶的一些方法外,re文字處理能力也很強大。

正則表達式元字符說明

[python正則表達式]

導入和查看正則表達式模塊

import re

查看正則表達式模塊方法

dir(re)

[‘DEBUG’, ‘DOTALL’, ‘I’, ‘IGNORECASE’, ‘L’, ‘LOCALE’, ‘M’, ‘MULTILINE’, ‘S’, ‘Scanner’, ‘T’,’TEMPLATE’, ‘U’, ‘UNICODE’, ‘VERBOSE’, ‘X’, ‘_MAXCACHE’, ‘all‘, ‘builtins‘, ‘doc‘,’file‘, ‘name‘, ‘package‘, ‘version‘, ‘_alphanum’, ‘_cache’, ‘_cache_repl’,’_compile’, ‘_compile_repl’, ‘_expand’, ‘_pattern_type’, ‘_pickle’, ‘_subx’, ‘compile’,’copy_reg’, ‘error’, ‘escape’, ‘findall’, ‘finditer’, ‘match’, ‘purge’, ‘search’, ‘split’,’sre_compile’, ‘sre_parse’, ‘sub’, ‘subn’, ‘sys’, ‘template’]

提示:

1. 當我們不會用模塊方法的時候用help

2. py2中pattern中的字符串要和string的編碼一致,不然會找不到,這個經常出現。

python3安裝遇到的坑

[root@bogon bin]# python3

python3: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

解決方法:

[root@bogon bin]# echo “/usr/lib” /etc/ld.so.conf.d/python3.6.conf

[root@bogon bin]# ldconfig

[root@bogon bin]# ldd /usr/bin/python3

linux-vdso.so.1 =  (0x00007ffdcdd46000)

libpython3.6m.so.1.0 = /usr/lib/libpython3.6m.so.1.0 (0x00007fddfe4f1000)  這裡,之前是顯示not found

libpthread.so.0 = /lib64/libpthread.so.0 (0x00007fddfe2d5000)

libdl.so.2 = /lib64/libdl.so.2 (0x00007fddfe0d0000)

libutil.so.1 = /lib64/libutil.so.1 (0x00007fddfdecd000)

libm.so.6 = /lib64/libm.so.6 (0x00007fddfdbcb000)

libc.so.6 = /lib64/libc.so.6 (0x00007fddfd807000)

/lib64/ld-linux-x86-64.so.2 (0x000055d9c1cf5000)

[root@bogon bin]# python3

Python 3.6.4 (default, Jan  3 2018, 10:00:47)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux

Type “help”, “copyright”, “credits” or “license” for more information.

關於ldconfig:(以下來自網絡)

ldconfig命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.

1. 往/lib和/usr/lib裡面加東西,是不用修改/etc/ld.so.conf的,但是完了之後要調一下ldconfig,不然這個library會找不到

2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然後再調用ldconfig,不然也會找不到

比如安裝了一個mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,這時就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存過後ldconfig一下,新的library才能在程序運行時被找到。

3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有權限加東西)。那也可以,就是export一個全局變量LD_LIBRARY_PATH,然後運行程序的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有權限或臨時需要的時候使用。

4. ldconfig做的這些東西都與運行程序時有關,跟編譯時一點關係都沒有。編譯的時候還是該加-L就得加,不要混淆了。

5. 總之,就是不管做了什麼關於library的變動後,最好都ldconfig一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。

Python性能提升神器!lru_cache的介紹和講解

我們經常談論的緩存一詞,更多的類似於將硬盤中的數據存放到內存中以至於提高讀取速度,比如常說的redis,就經常用來做數據的緩存。 Python的緩存(lru_cache)是一種裝飾在被執行的函數上,將其執行的結果緩存起來,當下次請求的時候,如果請求該函數的傳參未變則直接返回緩存起來的結果而不再執行函數的一種緩存裝飾器。

那它和redis的區別在哪?有什麼優勢?怎麼使用? 下面為你講解

1.現在我們先不使用緩存來寫一個求兩數之和的函數,並調用執行它兩次:

執行結果

可以看到 test 被執行了兩次,現在我們加上緩存再進行執行:

執行結果

可以看到 test 函數只被執行了一次,第二次的調用直接輸出了結果,使用了緩存起來的值。

2.當我們使用遞歸求斐波拉契數列 (斐波那契數列指的是這樣一個數列:0,1,1,2,3,5,8,它從第3項開始,每一項都等於前兩項之和) 的時候,緩存對性能的提升就尤其明顯了:

不使用緩存求第40項的斐波拉契數列

執行時間

使用緩存求第40項的斐波拉契數列:

執行時間

兩個差距是非常明顯的,因為不使用緩存時,相當於要重複執行了很多的函數,而使用了 lru_cache 則把之前執行的函數結果已經緩存了起來,就不需要再次執行了。

查看lru_cache源碼會發現它可以傳遞兩個參數: maxsize 、 typed :

代表被lru_cache裝飾的方法最大可緩存的結果數量 (被裝飾方法傳參不同一樣,則結果不一樣;如果傳參一樣則為同一個結果) , 如果不指定傳參則默認值為128,表示最多緩存128個返回結果,當達到了128個時,有新的結果要保存時,則會刪除最舊的那個結果。如果maxsize傳入為None則表示可以緩存無限個結果;

默認為false,代表不區分數據類型,如果設置為True,則會區分傳參類型進行緩存,官方是這樣描述的:

但在python3.9.8版本下進行測試,typed為false時,按照官方的測試方法測試得到的還是會被當成不同的結果處理,這個時候typed為false還是為true都會區別緩存,這與官方文檔的描述存在差異:

執行結果

但如果是多參數的情況下,則會被當成一個結果:

執行結果

這個時候設置typed為true時,則會區別緩存:

執行結果

當傳參個數大於1時,才符合官方的說法,不清楚是不是官方舉例有誤

當傳遞的參數是dict、list等的可變參數時,lru_cache是不支持的,會報錯:

報錯結果

緩存 緩存位置 是否支持可變參數 是否支持分布式 是否支持過期時間設置 支持的數據結構 需單獨安裝 redis 緩存在redis管理的內存中 是 是 是 支持5種數據結構 是 lru_cache 緩存在應用進程的內存中,應用被關閉則被清空 否 否 否 字典(參數為:key,結果為:value) 否

經過上面的分析,lru_cache 功能相對於redis來說要簡單許多,但使用起來更加方便,適用於小型的單體應用。如果涉及的緩存的數據種類比較多並且想更好的管理緩存、或者需要緩存數據有過期時間(類似登錄驗證的token)等,使用redis是優於lru_cache的。

你可能沒有在Python3中使用但卻應該使用的東西

由於Python EOL的發布,許多人開始將他們的Python版本從2切換到3。不幸的是,我發現大多數Python3看起來仍然像Python2,但是要加括號(儘管在我之前的文章《使用Python進行web抓取介紹》中的代碼示例也是這樣)。下面,我將展示一些令人興奮的特性示例,你只能在Python3中使用它們,希望它可以讓你使用Python解決問題變得更容易。

所有示例都是在Python 3.7中編寫的,每個特性都包含該特性所需的最低Python版本。

在任何編程語言中,沒有字符串是很難做任何事情的,為了保持理智,你希望有一種結構化的方法來處理字符串。大多數使用Python的人更喜歡使用format方法。

除了format,Python 3還提供了一種通過f-strings進行字符串插值的靈活方法。和上面一樣使用f-strings的代碼是這樣的:

f-strings非常棒,但是有些字符串(比如文件路徑)有自己的庫,這使得它們的操作更加容易。Python 3提供了pathlib作為一個處理文件路徑的方便抽象。如果你不確定為什麼你應該使用pathlib,試着閱讀這篇優秀的文章——《為什麼你應該使用pathlib》——Trey Hunner。

靜態和動態類型是軟件工程中一個熱門的話題,幾乎每個人都對此有自己的看法。我將讓讀者決定何時應該編寫類型,但我認為你至少應該知道Python 3支持類型提示。

Python 3提供了一種通過Enum類來編寫枚舉的簡單方法。枚舉是封裝常量列表的一種方便的方法,因此它們不會在沒有太多結構的情況下隨機分布在你的代碼中。

枚舉是一組符號名稱(成員),它們綁定到惟一的常量值。在枚舉中,可以通過標識對成員進行比較,並且枚舉本身也可以被遍歷。

緩存存在於我們今天使用的幾乎所有水平的軟件和硬件中。Python 3通過將LRU(最近最少使用的)緩存公開為一個名為lru_cache的裝飾器,使得使用它們變得非常簡單。

下面是一個簡單的Fibonacci函數,我們知道它將從緩存中受益,因為它通過遞歸多次執行相同的任務。

現在我們可以使用lru_cache對其進行優化(這種優化技術稱為memoization(記憶化))。執行時間從幾秒降到幾納秒。

請查看代碼(文檔 )。

Python 3引入了數據類,這些數據類並沒有太多限制,可以使用它們來減少樣板代碼,因為裝飾器會自動生成特殊的方法,比如__init__() 和__repr()__。根據官方建議,它們被描述為“具有默認值的可變命名元組”。

使用數據類的Armor的相同實現。

結構化Python代碼的一種方法是在包中(帶有一個__init__.py文件的文件夾)。下面的示例是由官方Python文檔提供的。

在Python2中,上面的每個文件夾都必須有一個__init__.py文件,它會將該文件夾轉換為一個Python包。在Python3中,隨着隱式命名空間包的引入,這些文件就不再需要了。

編者注:正如一些人所說,這並不像我在本節中指出的那樣簡單,從官方的PEP 420規範來看——__init__.py對於普通包仍然是必需的,將它從文件夾結構中刪除將會把文件夾變成一個帶有附加限制的本地命名空間包,關於本機命名空間包的官方文檔對此展示了一個很好的例子,以及命名所有的限制。

就像互聯網上幾乎所有的列表一樣,本列表並不完整。我希望這篇文章至少向你展示了一個你以前並不知道的Python 3功能,它將幫助你編寫更簡潔、更直觀的代碼。一如既往,所有的代碼都可以在GitHub上找到。

( )

python3_原生 LRU 緩存

原生 LRU 緩存(最低 Python 版本為 3.2)

目前,幾乎所有層面上的軟件和硬件中都需要緩存。Python 3 將 LRU(最近最少使用算法)緩存作為一個名為「lru_cache」的裝飾器,使得對緩存的使用非常簡單。

下面是一個簡單的斐波那契函數,我們知道使用緩存將有助於該函數的計算,因為它會通過遞歸多次執行相同的工作。

現在,我們可以使用「lru_cache」來優化它(這種優化技術被稱為「memoization」)。通過這種優化,我們將執行時間從幾十秒降低到了幾秒。

原創文章,作者:KSMNC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/313266.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KSMNC的頭像KSMNC
上一篇 2025-01-07 09:43
下一篇 2025-01-07 09:43

相關推薦

發表回復

登錄後才能評論