Python鏈式操作:PyFunctional
Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
特性PyFunctional通過使用鏈式功能操作符使得創建數據管道變得簡單。以下是pyfunctional及其內置工具可以做什麼的幾個例子:
● 鏈式運算符:seq(1, 2, 3).map(lambda x: x * 2).reduce(lambda x, y: x + y)
● 易表達且功能完整的API
● 讀寫 text, csv, json, jsonl, sqlite, gzip, bz2和lzma/xz文件
● 並行化「embarrassingly parallel」操作像map一樣方便
● 完整的文檔,嚴格的單元測試套件,100%的測試覆蓋率,以及提供健壯性的CI
pyfunctional API的靈感來自於Scala集合,Apache Spark RDDS,和微軟的LINQ。
安裝在pypi上可以獲得PyFunctional並且可以通過運行以下命令安裝:
然後在python上運行:from functional import seq
示例PyFunctional對許多任務有用,並可以打開幾種常見的文件類型。以下是你能做的一些例子。
簡單的例子流、轉換和動作PyFunctional有三種類型的功能:
1、流:讀取數據以供集合API使用。
2、轉換:使用諸如map, flat_map和filter之類的函數從流中轉換數據。
3、動作:引起一系列的轉變來求一個具體的值。to_list,reduce和to_dict是動作的例子。
在表達式seq(1, 2, 3).map(lambda x: x * 2).reduce(lambda x, y: x + y)中,seq是流,map是變換,而reduce是動作。
過濾賬戶交易列表字數統計和連接賬戶交易示例可以使用列表解析用純Python輕鬆完成。為了展示PyFunctional擅長的一些事情,請看一下幾個字數統計的例子。
在下一示例中,我們使用包含消息和元數據的json(jsonl)格式的聊天記錄。一個典型的jsonl文件每行上有一個有效的json。以下是examples/chat_logs.jsonl中的幾行。
接下來,讓我們繼續這個例子,但是從examples/users.json引入一個用戶的json資料庫。在前面的例子中,我們展示了PyFunctional如何進行字數統計,下一個例子中展示PyFunctional如何加入不同的數據源。
CSV,聚合函數,和集合函數在examples/camping_purchases.csv中有一個露營購物列表。讓我們做一些成本分析,並比較存儲在examples/gear_list.txt所需的野營裝備列表。
除了上面顯示的聚合函數(sum和max_by)之外,還有更多。同樣地,除了difference之外,還有一些集合函數。
讀/寫SQLite3PyFunctional可以讀取和寫入SQLite3資料庫文件。在下面的示例中,從中examples/users.db讀取用戶,將其列id:Int和name:String作為行存儲。
寫入SQLite3資料庫同樣簡單
寫入文件就像PyFunctional可以從csv, json, jsonl, sqlite3和text文件讀取一樣,也可以寫入它們。有關完整的API文檔,請參閱集合API表或者官方文檔。
壓縮文件
PyFunctional將自動檢測用gzip, lzma/xz和bz2壓縮的文件。這是通過檢查文件的前幾個位元組來確定它是否被壓縮,因此不需要修改代碼來工作。
要編寫壓縮文件,每個to_函數都有一個參數compression,可以將其設置為默認None用於無壓縮,gzip或gz用於gzip壓縮,lzma或xz用於lzma壓縮和bz2用於bz2壓縮。
並行執行啟用並行性所需的唯一更改是導入from functional import pseq而不是from functional import seq,而且使用seq的地方使用pseq。以下操作並行運行,在將來的版本中將實現更多的操作:
● map/select
● filter/filter_not/where
● flat_map
並行化使用Python multiprocessing和embarrassingly parallel操作鏈,來降低間接成本。例如,一系列映射和過濾器將一次執行,而不是使用multiprocessing在多循環中執行。
文檔下面是簡明的文檔,完整的文檔位於docs.pyfunctional.org。
Streams API所有的PyFunctional流都可以通過seq對象來訪問。創建一個流的主要方法是通過調用一個可迭代的seq。可調用的seq是靈活的,可以接受多種類型的參數,如下面的例子所示。
seq還提供了進入其他流的屬性函數,如下所示。
有關這些函數可以使用的參數的更多信息,請參考流文檔。
轉換和動作API下面是seq的流對象可以調用的函數的完整列表。有關完整的文檔參考轉換和操作API。
延遲執行
只要有可能,PyFunctional將延遲計算。這是通過跟蹤已經應用到序列的轉換列表來完成的,並且只有在一個動作被調用時才對它們進行求值。在PyFunctional中,這被稱為跟蹤譜系。這也是PyFunctional緩存計算結果的能力,以防止昂貴的重新計算。這主要是為了保持明智的行為,並謹慎使用。 例如,調用size將緩存基礎序列。 如果這沒有完成,並且輸入是一個迭代器,那麼進一步的調用將在一個已到期的迭代器上運行,因為它被用來計算長度。 類似地, repr也是緩存的,因為它在互動式會話中經常使用, 而互動式對話中不希望重新計算相同的值。 以下是一些檢查譜系的例子。
如果通過seq.open和相關API打開文件,則會給予特殊處理。 functional.util.ReusableFile實現了標準python文件的包裝,以支持在單個文件對象上的多次迭代,同時正確處理迭代終止和文件關閉。
路線圖的想法● 基於SQL的查詢計劃器和解釋器
● _ lambda運算符
● 準備1.0下一版本
貢獻和錯誤修復任何貢獻或錯誤報告都是受歡迎的。 到目前為止,pull請求的接受率為100%,貢獻者對代碼提供了有價值的反饋和評論。 聽到這個軟體包的用戶,特別是它的用途,運行良好,和還有什麼可以改進,真是太棒了。
如果你也想做出貢獻,創建一個PyFunctional的分支 ,進行更改,然後確保它們在TravisCI上運行時通過 (您可能需要註冊一個帳戶並鏈接Github)。 為了合併,所有的pull請求必須:
● 通過所有的單元測試
● 通過所有的pylint測試,或者忽略警告並解釋為什它這樣做是正確的
● 在coveralls.io上實現100%的測試覆蓋率。
● 編輯CHANGELOG.md文件
聯繫Gitter聊天
支持的Python版本PyFunctional支持Python 2.7, 3.3, 3.4.4, 3.5和PyPy
更新日誌更新日誌
關於我關於我(作者)要了解更多,請訪問我的網頁pedrorodriguez.io。
我是科羅拉多大學博爾德分校計算機科學博士研究生。 我的研究興趣包括大型機器學習,分散式計算和相鄰領域。 在2015年,我在加州大學伯克利分校完成了計算機科學本科學位。之前我曾在Apache Berkeley的加州大學伯克利分校進行過研究,曾在Trulia擔任數據科學家,今年夏天將擔任Oracle Data Cloud的數據科學家。
我在Trulia時廣泛使用Python,並且發現我想念Spark RDD和Scala集合操縱數據的易用性,創建了PyFunctional。當Scala不是一個選項或者PySpark過於複雜時,該項目從這些API和LINQ得到最好的想法來提供一個簡單的方法來操作數據。
貢獻者
這些人慷慨地貢獻了他們的時間來改進PyFunctional
● versae
● adrian17
● lucidfrontier45
● Digenis
● ChuyuHsu
英文原文:http://www.pyfunctional.org/
譯者:張新英
TAG:Python部落 |