1.Ruff——一個快速的 linter
有沒有人在 2022 年沒有使用 linter?
多年來,社群已經認識到 linters 是軟體開發過程的重要組成部分。他們分析源代碼中潛在的錯誤和樣式問題,提供有價值的回報和改進建議。最終,它們幫助開發人員編寫更幹淨、更高效的代碼。為了充分利用這個過程,擁有快速有效的 linter 非常重要。
Ruff 是一個用 Rust 編寫的非常快的 Python linter。它比現有的 linters快 10-100 倍,并且可以通過 pip 安裝。
從頭開始檢查 CPython 代碼庫。
除了 linting 之外,Ruff 還可以作為進階代碼轉換工具,能夠更新類型注釋、重寫類定義、排序導入等等。
它是一個強大的工具,旨在取代各種其他工具,包括 Flake8、isort、pydocstyle、yesqa、eradicate,甚至是 pyupgrade 和 autoflake 的子集,同時以閃電般的速度執行。
絕對是 2023 年加入你的武器庫的一大亮點!
2. python-benedict
字典是 Python 中重要的資料結構,但使用複雜的字典可能是一個挑戰。内置dict類型功能強大,但它缺少許多使通路和操作嵌套值或将字典與不同資料格式互相轉換的功能。如果你發現自己在 Python 中使用字典時遇到困難,那麼 python-benedict 可能是你一直在尋找的解決方案。
benedict是内置dict類型的子類,這意味着它與現有詞典完全相容,并且在大多數情況下可以用作直接替代品。
的關鍵特性之一benedict是它支援keylists和keypaths。這使得通路和操作複雜字典中的值變得容易,而無需手動挖掘嵌套級别。例如:
d = benedict()
# set values by keypath
d['profile.firstname'] = 'Fabio'
d['profile.lastname'] = 'Caccamo'
print(d) # -> { 'profile':{ 'firstname':'Fabio', 'lastname':'Caccamo' } }
print(d['profile']) # -> { 'firstname':'Fabio', 'lastname':'Caccamo' }
# check if keypath exists in dict
print('profile.lastname' in d) # -> True
# delete value by keypath
del d['profile.lastname']
除了它的鍵清單和鍵路徑支援之外,benedict還提供了廣泛的 I/O 快捷方式來處理各種資料格式。你可以輕松地從 JSON、YAML 和 INI 等格式以及 CSV、TOML 和 XML 等更專業的格式讀取和寫入字典。它還支援多個 I/O 操作後端,例如filepath(讀/寫)、url(隻讀)和雲端存儲(讀/寫)。
3.Memray— 記憶體分析器
優化系統的記憶體使用對于提高其性能和穩定性至關重要。記憶體洩漏會導緻程式消耗越來越多的記憶體,降低整體系統性能并最終崩潰。雖然垃圾收集器通常易于使用,但 Python 并沒有使你免受這些問題的影響。沒有什麼可以阻止循環引用或無法通路的對象(有關更多資訊,請閱讀垃圾收集的工作原理);如果我們談論 C/C++ 擴充,則更是如此。
記憶體分析器可以幫助你識别和修複這些問題,使其成為優化程式記憶體使用的重要工具。這就是 Memray 派上用場的地方!
它是一個記憶體分析器,跟蹤 Python 代碼、本機擴充子產品和 Python 解釋器本身的記憶體配置設定,提供記憶體使用情況的綜合視圖。Memray 生成各種報告,包括火焰圖,以幫助你分析收集的資料并識别洩漏和熱點等問題。它速度快,可與 Python 和本機線程一起使用,使其成為調試多線程程式中記憶體問題的多功能工具。
Memray 可以用作指令行工具或用作更細粒度分析任務的庫。它的實時模式允許你在腳本或子產品運作時以互動方式檢查記憶體使用情況,這對于調試複雜的記憶體模式非常有用。
Bloomberg 為認真的 Python 程式員準備的必備工具。
4.Codon— 使用 LLVM 的 Python 編譯器
我們都喜歡 Python,因為它簡單易用,但有時我們需要一點額外的運作速度。即使進行了所有優化,Python 解釋器(如 CPython)也隻能走這麼遠。當需要進一步提高性能時,編譯器就會出現。它們将我們的 Python 代碼轉換為處理器可以直接執行的機器代碼,跳過解釋器步驟,并給我們帶來一些顯着的性能提升。
Codon 是一種高性能的提前 Python 編譯器,甚至可以在速度方面與 C/C++ 競争,據報道典型的加速為10-100 倍或更多(在單線程上)。它可以使用@codon.jit裝飾器在更大的 Python 代碼庫中使用,也可以使用 Python 互操作性從 Codon 中調用純 Python 函數和庫。
天下沒有免費的午餐,是以你可能需要對你的 Python 代碼進行一些修改,以便它可以被 Codon 編譯。但是 Codon 對語言施加的限制最終會帶來性能提升。然而,編譯器将通過生成詳細的錯誤消息來指導你識别和幫助你解決不相容問題。
如果你希望加快代碼速度,絕對值得一試。
5. LangChain— 建構 LLM 支援的應用程式
除非你一直生活在岩石下,否則你很清楚生成人工智能今年一直在席卷全球。其中很大一部分是大型語言模型(LLM)。
我們過去幾年為解決 AI 問題而編寫的許多代碼都可以扔掉并用 LLM 代替(例如 GPT-3 或其演變——InstructGPT 或 ChatGPT——T5,或任何其他)。此外,我們還見證了LLM 接口的一種新程式設計語言的誕生:基于文本的提示。
LangChain 的出現是為了幫助充分利用 LLM 的全部力量。
第一:在任何認真使用 LLM 的情況下,人們通常不需要将提示視為一次性的東西,而是将這些東西的組合:模闆、使用者輸入和 LLM 可以作為參考的輸入/輸出示例。LangChain 通過提供接口,可以直接根據各個元件建構不同的提示,幫助你簡化這種“提示管理”。
其次,為了建構提示,有時你需要注入外部知識(甚至其他模型)。例如,假設你需要執行資料庫查詢以提取個性化電子郵件的客戶姓名。這就是鍊的概念,LangChain為此提供了統一的接口。
然後是擷取和擴充資料的概念,以便 LLM 可以處理你自己的資料,這與訓練模型所依據的“通用”資料相反。
你可以使用 LangChain 做更多的事情,例如準備在不更改代碼的情況下切換到另一個模型/提供商,建構具有記憶體的代理等。
當然,我們期望的創新工具将在 2023 年大幅增長!
6.fugue——輕松完成分布式計算
如果你熟悉 Pandas 或 SQL,就會知道這些工具非常适合進行中小型資料集。但是在處理更大量的資料時,往往需要像Spark這樣的分布式計算架構來高效處理。問題是,Spark 與 Pandas 或 SQL 完全不同。文法和概念完全不同,将代碼從一個遷移到另一個可能是一個挑戰。這就是賦格曲的用武之地。
Fugue 是一個庫,可以更輕松地使用Spark、Dask和Ray等分布式計算架構。它為分布式計算提供了一個統一的接口,使你可以在 Spark、Dask 和 Ray 上執行 Python、pandas 和 SQL 代碼,而隻需進行最少的重寫。
最好的起點是使用 Fugue 的transform()函數。它允許你通過将單個函數引入 Spark、Dask 或 Ray 來并行執行單個函數。請參閱以下示例,其中将map_letter_to_food()函數引入 Spark 執行引擎:
import pandas as pd
from typing import Dict
from pyspark.sql import SparkSession
from fugue import transform
input_df = pd.DataFrame({"id":[0,1,2], "value": (["A", "B", "C"])})
map_dict = {"A": "Apple", "B": "Banana", "C": "Carrot"}
def map_letter_to_food(df: pd.DataFrame, mapping: Dict[str, str]) -> pd.DataFrame:
df["value"] = df["value"].map(mapping)
return df
spark = SparkSession.builder.getOrCreate()
# use Fugue transform to switch execution to spark
df = transform(input_df,
map_letter_to_food,
schema="*",
params=dict(mapping=map_dict),
engine=spark
)
print(type(df))
df.show()
<class 'pyspark.sql.dataframe.DataFrame'>
+---+------+
| id| value|
+---+------+
| 0| Apple|
| 1|Banana|
| 2|Carrot|
+---+------+
Fugue 允許你為 Spark、Dask 和 Ray 項目維護一個代碼庫,其中邏輯和執行完全分離,進而使程式員不必學習每個不同的架構。
該庫還有其他一些有趣的功能和不斷壯大的社群,是以一定要檢查一下!
7.Diffusers——生成人工智能
2022 年将永遠被銘記為生成式人工智能突破人工智能社群前沿并擴充到外部世界的一年。這主要由Diffusion models提供支援,由于其在生成高品質圖像方面令人印象深刻的能力而受到廣泛關注。DALL·E 2、Imagen和Stable Diffusion隻是今年引起轟動的擴散模型的幾個例子。他們的結果激發了讨論和欽佩,因為他們生成圖像的能力突破了以前認為可能的界限——甚至是 AI 專家。
Hugging Face 的 Diffusers 庫是用于處理擴散模型的工具和技術的集合,包括穩定擴散模型,該模型已被證明在生成高度逼真和詳細的圖像方面特别有效。該庫還包括用于優化圖像生成模型性能和分析圖像生成實驗結果的工具。
開始使用此庫進行文本到圖像的生成可能就像删除以下幾行代碼一樣簡單:
import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16)
pipe = pipe.to("cuda")
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
但漫射器并不止于圖像。音頻生成甚至分子生成(!) 的功能即将推出。
看起來大多數擴散模型的開源實作都将利用該庫提供的建構塊。
8.LineaPy— 将筆記本轉換為生産流水線
Jupyter notebooks 是一種非常有用的原型設計和代碼開發工具。它們使你可以輕松地将代碼、繪圖、媒體和互動式小部件混合在一個文檔中,進而在你開發代碼時輕松記錄和了解你的代碼。它們是試驗代碼和測試想法的完美遊樂場,對于資料分析和機器學習任務尤其友善。但随着想法的進展,人們對結果感到滿意并希望将代碼投入生産,挑戰開始顯現。
notebook 中的代碼可能并不總是以易于部署到生産環境的方式建構。你是否應該使用筆記本的代碼并在别處重寫、子產品化并使其遵循最佳實踐?這是最常見的方法,但缺點是如果以後想要改進或調試某些東西,就會失去筆記本的互動性。是以現在你必須同時維護筆記本和單獨的生産代碼,這遠非理想。
感謝 LineaPy,有一條可以做得更好的途徑。
LineaPy 是一個 Python 庫,可幫助你從原型設計快速過渡到建立強大的資料管道。它可以處理你淩亂的筆記本,幫助清理和重構代碼,使其更容易在編排系統或作業排程程式(如 cron、Apache Airflow 或 Prefect)中運作。
它還有助于提高可重複性:它具有“工件”的概念,它封裝了資料和代碼,可以幫助你追溯價值是如何産生的。在高層次上,LineaPy 跟蹤代碼執行的順序以形成對代碼及其上下文的全面了解。
最好的部分?內建非常簡單,隻需兩行代碼就可以在Notebook環境下運作!
請務必檢視文檔,它通過非常全面的示例很好地展示了該工具解決的問題。
9.whylogs——模型監控
随着 AI 模型為企業創造實際價值,必須持續監控它們在生産中的行為,以確定價值随着時間的推移而持續。也就是說,必須有一種方法可以表明模型預測是可靠和準确的,并且提供給模型的輸入與用于訓練它的資料類型沒有顯着差異。
但模型監控不僅限于 AI 模型——它可以應用于任何類型的模型,包括統計和數學模型。是以這個選秀權的用處。
whylogs 是一個開源庫,可讓你記錄和分析任何類型的資料。它提供了一系列功能,首先是生成資料集摘要的能力:whylogs profiles。
配置檔案捕獲原始資料的統計資訊,例如分布、缺失值和許多其他可配置名額。它們是使用庫在本地計算的,甚至可以合并以允許對分布式和流式系統進行分析。它們形成了一種資料表示,友善地不需要公開資料本身,而隻需要公開從中導出的名額——這有利于隐私。
配置檔案很容易生成。例如,要從 Pandas 生成配置檔案,DataFrame你可以執行以下操作:
import whylogs as why
import pandas as pd
#dataframe
df = pd.read_csv("path/to/file.csv")
results = why.log(df)
但是配置檔案隻有在你決定用它們做什麼時才有用。為此,可視化是必須的。你可以安裝 可以為你建立互動式報告的viz子產品 。pip install "whylogs[viz]"這是 Jupyter Notebook 中的示例漂移報告:
使用 whylogs viz 子產品的示例漂移報告。
你還可以設定限制,以便在資料不符合預期時收到通知,有效地對你的資料/模型進行某種測試。畢竟,這不是我們從一開始就要做的嗎?
10.Mito——筆記本中的電子表格
在資料科學時代,許多人正在從在電子表格中手動分析資料轉變為編寫代碼來執行此操作。但不可否認的是,電子表格是一種很有吸引力的工具,它提供了一個簡化的編輯界面和允許快速疊代的即時回報。
很多時候,我們使用電子表格處理資料。但是如果我們想對新資料再次做同樣的事情,我們必須從頭開始!代碼在這方面做得更好,為我們節省了寶貴的時間。
我們能否兩全其美?遇見美圖。
Mito 派上用場,因為它是一個庫,允許你在 Jupyter Notebooks 中以類似電子表格的界面處理資料。它允許你導入和編輯 CSV 和 XLSX 檔案、生成資料透視表和圖形、過濾和排序資料、合并資料集以及執行各種其他資料操作任務。
最重要的功能:Mito 将生成對應于你的每個編輯的Python 代碼!
美圖的工作原理。
Mito 還支援使用 Excel 樣式的公式,并提供資料列的彙總統計。它旨在成為資料科學工具包中的第一個工具,這意味着它被建構為一個使用者友好的資料探索和分析工具。
像 Mito 這樣的工具降低了進入資料科學世界的門檻,讓熟悉 Excel 或 Google Sheets 等軟體的人(幾乎每個人?)都能快速開始貢獻代碼。
如果你發現我的任何文章對你有幫助或者有用,麻煩點贊、轉發或者贊賞。 謝謝!