、算法設計
Python 的數(shù)據(jù)結(jié)構(gòu),算法和設計模式的實現(xiàn)。另請參閱真棒算法。
演算法
algorithms 數(shù)據(jù)結(jié)構(gòu)和算法的最小示例。
https://github.com/keon/algorithms
python-ds 用于采訪采訪的數(shù)據(jù)結(jié)構(gòu)和算法的集合。
https://github.com/prabhupant/python-ds
sortedcontainers 排序集合的快速和純 Python 實現(xiàn)。
https://github.com/grantjenks/python-sortedcontainers
TheAlgorithms- 用 Python 實現(xiàn)的所有算法。
https://github.com/TheAlgorithms/Python
設計模式
PyPattyrn- 一個簡單但有效的庫,用于實現(xiàn)常見的設計模式。
https://github.com/tylerlaberge/PyPattyrn
python-patterns -Python 中設計模式的集合。
https://github.com/faif/python-patterns
transitions - 一種輕量級的,面向?qū)ο蟮挠邢逘顟B(tài)機實現(xiàn)。
https://github.com/pytransitions/transitions
二、聲音、視頻、圖像、文字處理
用于處理音頻及其元數(shù)據(jù)的庫。
聲音的
audioread- 跨庫(GStreamer + 核心音頻 + MAD + FFmpeg)音頻解碼。
https://github.com/beetbox/audioread
dejavu- 音頻指紋識別。
https://github.com/worldveil/dejavu
kapre - Keras 音頻預處理器
https://github.com/keunwoochoi/kapre
librosa- 用于音頻和音樂分析的 Python 庫
https://github.com/librosa/librosa
matchering - 一個用于自動參考音頻制作的庫。
https://github.com/sergree/matchering
mingus- 帶有 MIDI 文件和播放支持的高級音樂理論和樂譜包。
http://bspaans.github.io/python-mingus/
pyAudioAnalysis- 音頻特征提取,分類,分段和應用。
https://github.com/tyiannak/pyAudioAnalysis
pydub- 使用簡單易用的高級界面處理音頻。
https://github.com/jiaaro/pydub
TimeSide- 開放的 Web 音頻處理框架。
https://github.com/Parisson/TimeSide
Metadata
beets- 音樂庫管理器和 MusicBrainz 標記器。
https://github.com/beetbox/beets
eyeD3- 一種用于處理音頻文件的工具,特別是包含 ID3 元數(shù)據(jù)的 MP3 文件。
https://github.com/nicfit/eyeD3
mutagen- 處理音頻元數(shù)據(jù)的 Python 模塊。
https://github.com/quodlibet/mutagen
tinytag- 用于讀取 MP3,OGG,F(xiàn)LAC 和 Wave 文件的音樂元數(shù)據(jù)的庫。
https://github.com/devsnd/tinytag
用于處理視頻和 GIF 的庫。
moviepy- 用于基于腳本的電影編輯的模塊,具有多種格式,包括動畫 GIF。
https://zulko.github.io/moviepy/
scikit-video -SciPy 的視頻處理例程。
https://github.com/aizvorski/scikit-video
vidgear- 最強大的多線程視頻處理框架。
https://github.com/abhiTronix/vidgear
用于處理圖像的庫。
hmap- 圖像直方圖重新映射。
https://github.com/rossgoodwin/hmap
imgSeek- 使用視覺相似性搜索圖像集合的項目。
https://sourceforge.net/projects/imgseek/
nude.py- 裸露檢測。
https://github.com/hhatto/nude.py
pagan - 復古 identicon(阿凡達)根據(jù)輸入的字符串和哈希生成。
https://github.com/daboth/pagan
pillow- 枕頭是友好的 PIL 叉。
https://github.com/python-pillow/Pillow
python- barcode - 在 Python 中創(chuàng)建條形碼,沒有任何額外的依賴關系。
https://github.com/WhyNotHugo/python-barcode
pygram- 類似 Instagram 的圖像過濾器。
https://github.com/ajkumar25/pygram
PyMatting -Alpha 遮罩的庫。
http://github.com/pymatting/pymatting
python-qrcode- 一個純 Python QR Code 生成器。
https://github.com/lincolnloop/python-qrcode
pywal- 一種從圖像生成配色方案的工具。
https://github.com/dylanaraps/pywal
pyvips- 具有低內(nèi)存需求的快速圖像處理庫。
https://github.com/libvips/pyvips
Quads - 基于四叉樹的計算機藝術。
https://github.com/fogleman/Quads
scikit-image- 用于(科學)圖像處理的 Python 庫。
http://scikit-image.org/
thumbor- 智能影像服務。它可以按需裁剪,調(diào)整圖像大小和翻轉(zhuǎn)圖像。
https://github.com/thumbor/thumbor
wand - MagickWand 的 Python 綁定,ImageMagick 的 C API。
https://github.com/dahlia/wand
用于解析和處理純文本的庫。
一般的
chardet- 與 Python 2/3 兼容的字符編碼檢測器。
https://github.com/chardet/chardet
difflib-(Python 標準庫)用于計算增量的幫助程序。
https://docs.python.org/3/library/difflib.html
ftfy- 自動使 Unicode 文本更清晰,更一致。
https://github.com/LuminosoInsight/python-ftfy
Fuzzywuzzy- 模糊字符串匹配。
https://github.com/seatgeek/fuzzywuzzy
Levenshtein- 快速計算 Levenshtein 距離和字符串相似度。
https://github.com/ztane/python-Levenshtein/
pangu.py- 偏執(zhí)的文字間距。
https://github.com/vinta/pangu.py
pyfiglet- 用 Python 編寫的 figlet 的實現(xiàn)。
https://github.com/pwaller/pyfiglet
pypinyin- 將漢字(Hanzi)轉(zhuǎn)換為拼音(Pyyin)。
https://github.com/mozillazg/python-pinyin
textdistance- 使用 30 多種算法計算序列之間的距離。
https://github.com/orsinium/textdistance
unidecode -Unicode 文本的 ASCII 音譯。
https://pypi.org/project/Unidecode/
Slugify
awesome-slugify- 一個可以保留 unicode 的 Python slugify 庫。
https://github.com/dimka665/awesome-slugify
python-slugify- 一個 Python slugify 庫,它將 unicode 轉(zhuǎn)換為 ASCII。
https://github.com/un33k/python-slugify
unicode-slugify- 一種 Slugifier,它以 Django 為依賴項生成 unicode slug。
https://github.com/mozilla/unicode-slugify
唯一標識符
hashids- 在 Python 中實現(xiàn) hashids。
https://github.com/davidaurelio/hashids-python
shortuuid- 簡潔,明確和 URL 安全的 UUID 的生成器庫。
https://github.com/skorokithakis/shortuuid
解析器
ply - 的 lex 和 yacc 解析工具的 Python 實現(xiàn)。
https://github.com/dabeaz/ply
pygments- 通用語法熒光筆。
http://pygments.org/
pyparsing- 生成解析器的通用框架。
https://github.com/pyparsing/pyparsing
python-nameparser - 將人名解析為它們的各個組成部分。
https://github.com/derek73/python-nameparser
python-phonenumbers- 解析,格式化,存儲和驗證國際電話號碼。
https://github.com/daviddrysdale/python-phonenumbers
python-user-agents- 瀏覽器用戶代理解析器。
https://github.com/selwin/python-user-agents
sqlparse- 一個非驗證的 SQL 解析器。
https://github.com/andialbrecht/sqlparse
三、日期和時間
用于處理日期和時間的庫。
Arrow- 一個 Python 庫,提供了一種明智且人性化的方法來創(chuàng)建,操作,格式化和轉(zhuǎn)換日期,時間和時間戳。
https://arrow.readthedocs.io/en/latest/
Chronyk- 一個 Python 3 庫,用于解析人類編寫的時間和日期。
https://github.com/KoffeinFlummi/Chronyk
dateutil- 標準 Python datetime 模塊的擴展。
https://github.com/dateutil/dateutil
delorean- 一個庫,用于清除與日期時間有關的不便的事實。
https://github.com/myusuf3/delorean/
maya- 人類的日期時間。
https://github.com/timofurrer/maya
moment - 一個 Python 庫用于處理日期 / 時間。受到 Moment.js 的啟發(fā)。
https://github.com/zachwill/moment
Pendulum-Python 日期時間變得容易。
https://github.com/sdispater/pendulum
PyTime- 一個易于使用的 Python 模塊,旨在按字符串操作日期 / 時間 / 日期時間。
https://github.com/shinux/PyTime
pytz- 世界時區(qū)定義,現(xiàn)代和歷史。將 tz 數(shù)據(jù)庫帶入 Python。
https://launchpad.net/pytz
when.py- 提供用戶友好的功能來幫助執(zhí)行常見的日期和時間操作。
https://github.com/dirn/When.py
四、爬蟲
自動執(zhí)行 Web 抓取。
cola- 分布式抓取框架。
https://github.com/chineking/cola
feedparser- 通用供稿解析器。
https://pythonhosted.org/feedparser/
grab - 網(wǎng)站抓取框架。
https://github.com/lorien/grab
MechanicalSoup- 用于自動與網(wǎng)站進行交互的 Python 庫。
https://github.com/MechanicalSoup/MechanicalSoup
portia - Scrapy 的視覺抓取。
https://github.com/scrapinghub/portia
pyspider- 強大的蜘蛛系統(tǒng)。
https://github.com/binux/pyspider
robobrowser- 一個簡單的 Pythonic 庫,無需獨立的 Web 瀏覽器即可瀏覽 Web。
https://github.com/jmcarp/robobrowser
scrapy- 快速的高級屏幕抓取和網(wǎng)絡爬網(wǎng)框架。
https://scrapy.org/
用于提取 Web 內(nèi)容的庫。
html2text- 將 HTML 轉(zhuǎn)換為 Markdown 格式的文本。
https://github.com/Alir3z4/html2text
lassie- 人類的 Web 內(nèi)容檢索。
https://github.com/michaelhelmick/lassie
micawber- 一個小型庫,用于從 URL 中提取豐富的內(nèi)容。
https://github.com/coleifer/micawber
newspaper -Python 中的新聞提取,文章提取和內(nèi)容管理。
https://github.com/codelucas/newspaper
python- readability - arc90 的可讀性工具的快速 Python 端口。
https://github.com/buriy/python-readability
requests-html –適用于人類的 Pythonic HTML 解析。
https://github.com/psf/requests-html
sumy- 自動匯總文本文檔和 HTML 頁面的模塊。
https://github.com/miso-belica/sumy
textract- 從任何文檔,Word,PowerPoint,PDF 等中提取文本
https://github.com/deanmalmgren/textract
toapi- 每個網(wǎng)站都提供 API。
https://github.com/gaojiuli/toapi
五、HTML、XML
用于處理 HTML 和 XML 的庫。
BeautifulSoup- 提供 Pythonic 慣用法來迭代,搜索和修改 HTML 或 XML。
bleach –基于白名單 HTML 清理和文本 linkification 庫中的。
cssutils- 一個 Python 的 CSS 庫。
html5lib- 一個符合標準的庫,用于解析和序列化 HTML 文檔和片段。
lxml- 一個非常快速,易于使用的通用庫,用于處理 HTML 和 XML。
MarkupSafe- 為 Python 實現(xiàn) XML / HTML / XHTML 標記安全字符串。
pyquery- 用于解析 HTML 的類似 jQuery 的庫。
untangle –將 XML 文檔轉(zhuǎn)換為 Python 對象,以方便訪問。
WeasyPrint- 用于 HTML 和 CSS 的可視渲染引擎,可以導出為 PDF。
xmldataset- 簡單的 XML 解析。
xmltodict- 使用 XML 就像使用 JSON。
六、HTTP 客戶端
使用 HTTP 的庫。
grequests- 異步 HTTP 請求的 request + gevent。
httplib2- 全面的 HTTP 客戶端庫。
httpx- 用于 Python 的下一代 HTTP 客戶端。
requests -HTTP 對人類的請求。
treq -Python 請求,例如在 Twisted 的 HTTP 客戶端之上構(gòu)建的 API。
七、office 模塊
用于解析和處理特定文本格式的庫。
General
tablib -XLS,CSV,JSON,YAML 中的表格數(shù)據(jù)集的模塊。
Office
docxtpl- 通過 jinja2 模板編輯 docx 文檔
openpyxl- 用于讀取和寫入 Excel 2010 xlsx /xlsm/xltx /xltm 文件的庫。
pyexcel- 提供一個用于讀取,操作和寫入 csv,ods,xls,xlsx 和 xlsm 文件的 API。
python-docx- 讀取,查詢和修改 Microsoft Word 2007/2008 docx 文件。
python-pptx- 用于創(chuàng)建和更新 PowerPoint(.pptx)文件的 Python 庫。
unoconv- 在 LibreOffice / OpenOffice 支持的任何文檔格式之間轉(zhuǎn)換。
XlsxWriter- 一個用于創(chuàng)建 Excel .xlsx 文件的 Python 模塊。
xlwings -BSD 許可的庫,可以輕松地從 Excel 調(diào)用 Python,反之亦然。
xlwt / xlrd- 從 Excel 文件寫入和讀取數(shù)據(jù)以及格式化信息。
PDF 格式
PDFMiner- 一種從 PDF 文檔提取信息的工具。
PyPDF2- 一個能夠拆分,合并和轉(zhuǎn)換 PDF 頁面的庫。
ReportLab- 允許快速創(chuàng)建豐富的 PDF 文檔。
Markdown
Mistune-Markdown 最快,功能最全的純 Python 解析器。
Python-Markdown -John Gruber 的 Markdown 的 Python 實現(xiàn)。
YAML
PyYAML- 適用于 Python 的 YAML 實現(xiàn)。
CSV
csvkit- 轉(zhuǎn)換為 CSV 并使用 CSV 的實用程序。
Archive
unp- 一個命令行工具,可以輕松地解壓縮檔案。
八、序列化
用于序列化復雜數(shù)據(jù)類型的庫
marshmallow- 一個輕量級的庫,用于將復雜的對象與簡單的 Python 數(shù)據(jù)類型相互轉(zhuǎn)換。
pysimdjson - 一個 Python 綁定 simdjson。
python-rapidjson- 一個 Python 包裝周圍 RapidJSON。
ultrajson- 使用 Python 綁定用 C 編寫的快速 JSON 解碼器和編碼器。
九、代碼分析、測試
碼質(zhì)量檢查器的工具。另請參閱令人敬畏的靜態(tài)分析。
代碼分析
Coala- 語言獨立且易于擴展的代碼分析應用程序。
code2flow- 將您的 Python 和 JavaScript 代碼轉(zhuǎn)換為 DOT 流程圖。
prospector- 分析 Python 代碼的工具。
pycallgraph- 一個可視化 Python 應用程序流程(調(diào)用圖)的庫。
vulture- 查找和分析無效的 Python 代碼的工具。
Code Linters
flake8 - 一個包裝器 pycodestyle,pyflakes 和麥凱布。
很棒的片狀 8 擴展
pylama- 用于 Python 和 JavaScript 的代碼審核工具。
pylint- 完全可定制的源代碼分析器。
wemake-python-styleguide- 有史以來最嚴格,最自以為是的 python linter。
代碼格式化程序
black –毫不妥協(xié)的 Python 代碼格式化程序。
isort- 用于對導入進行排序的 Python 實用程序 / 庫。
yapf- 另一個來自 Google 的 Python 代碼格式化程序。
靜態(tài)類型檢查器,另請參見 awesome-python-typing
mypy- 在編譯期間檢查變量類型。
pyre-check- 性能類型檢查。
typeshed- 具有靜態(tài)類型的 Python 庫存根的集合。
靜態(tài)類型注釋生成器
MonkeyType- 一個用于 Python 的系統(tǒng),通過收集運行時類型來生成靜態(tài)類型注釋。
pyannotate- 自動生成 PEP-484 注釋。
pytype -pytype 檢查并推斷 Python 代碼的類型 - 無需類型注釋。
滲透測試的框架和工具。
fsociety- 滲透測試框架。
setoolkit- 社會工程的工具包。
sqlmap- 自動 SQL 注入和數(shù)據(jù)庫接管工具。
用于測試代碼庫和生成測試數(shù)據(jù)的庫。
測試框架
hypothesis –假設是一個高級的 Quickcheck 樣式基于屬性的測試庫。
nose2 -nose 基于 `unittest2。的后繼者。
pytest- 一個成熟的功能齊全的 Python 測試工具。
Robot Framework 通用的測試自動化框架。
unittest-(Python 標準庫)單元測試框架。
測試選手
green - 干凈,多彩的測試運行器。
mamba -Python 的權(quán)威測試工具。生于 BDD 的旗幟下。
tox- 自動構(gòu)建和測試多個 Python 版本的發(fā)行版
GUI / Web 測試
locust- 用 Python 編寫的可擴展用戶負載測試工具。
PyAutoGUI -PyAutoGUI 是適用于人類的跨平臺 GUI 自動化 Python 模塊。
Schemathesis- 用于對基于 Open API / Swagger 規(guī)范構(gòu)建的 Web 應用程序進行基于屬性的自動測試的工具。
Selenium - Selenium WebDriver 的 Python 綁定。
sixpack- 與語言無關的 A / B 測試框架。
splinter- 用于測試 Web 應用程序的開源工具。
Mock
doublex- 強大的 Python 測試框架加倍。
Frozengun- 通過模擬 datetime 模塊來穿越時間。
httmock- 一個針對 Python 2.6 + 和 3.2 + 的請求的模擬庫。
httpretty- 適用于 Python 的 HTTP 請求模擬工具。
mock-(Python 標準庫)一個模擬和修補庫。
mocket - 具有 gevent /asyncio/ SSL 支持的套接字模擬框架。
responses 一個實用程序庫,用于模擬請求 Python 庫。
VCR.py- 記錄并重放測試中的 HTTP 交互。
對象工廠
factory_boy -Python 的測試裝置替代品。
mixer- 另一種燈具更換。支持 Django,F(xiàn)lask,SQLAlchemy,Peewee 等
model_mommy- 創(chuàng)建隨機夾具以在 Django 中進行測試。
代碼覆蓋率
coverage- 代碼覆蓋率度量。
偽數(shù)據(jù)
fake2db- 偽數(shù)據(jù)庫生成器。
faker- 一個生成偽造數(shù)據(jù)的 Python 包。
mimesis- 是一個 Python 庫,可幫助您生成虛假數(shù)據(jù)。
radar - 生成隨機的日期時間 / 時間。
用于驗證數(shù)據(jù)的庫。
Cerberus- 一個輕量級和可擴展的數(shù)據(jù)驗證庫。
colander- 驗證和反序列化通過 XML,JSON 和 HTML 表單發(fā)布獲得的數(shù)據(jù)。
jsonschema - Python 的 JSON 模式的實現(xiàn)。
schema- 用于驗證 Python 數(shù)據(jù)結(jié)構(gòu)的庫。
Schematics –數(shù)據(jù)結(jié)構(gòu)驗證。
valideer - 輕量級可擴展數(shù)據(jù)驗證和適配庫。
voluptuous - 的 - 一個 Python 數(shù)據(jù)驗證庫。
十、web 框架
傳統(tǒng)的全棧 Web 框架。另請參閱 RESTful API。
同步
Django -Python 中最流行的 Web 框架。
很棒的 django
很棒的 django
Flask -Python 的微框架。
很棒的燒瓶
Pyramid- 一個小型,快速,扎實的開源 Python Web 框架。
真棒金字塔
Masonite- 以開發(fā)人員為中心的現(xiàn)代 Python Web 框架。
異步
Tornado- 一個 Web 框架和異步網(wǎng)絡庫。
十一、搜索
用于對數(shù)據(jù)建立索引并執(zhí)行搜索查詢的庫和軟件。
django-haystack- 模塊化搜索 Django。
elasticsearch-dsl-py -Elasticsearch 的官方高級 Python 客戶端。
elasticsearch-py - Elasticsearch 的官方低層 Python 客戶端。
pysolr - Apache Solr 的輕量級 Python 包裝器。
whoosh- 一個快速的純 Python 搜索引擎庫。
十二、日志記錄
用于生成和使用日志的庫。
logbook - - 記錄 Python 的替換記錄。
logging-(Python 標準庫)Python 的日志記錄工具。
loguru- 旨在以 Python 帶來令人愉悅的日志記錄的庫。
sentry- python - 適用于 Python 的 Sentry SDK。
structlog- 結(jié)構(gòu)化日志變得容易。
十三、并發(fā)與并行
用于并發(fā)和并行執(zhí)行的庫。另請參閱 awesome-asyncio。
parallel.futures-(Python 標準庫)用于異步執(zhí)行可調(diào)用對象的高級接口。
eventlet- 具有 WSGI 支持的異步框架。
gevent- 使用 greenlet 的基于協(xié)程的 Python 網(wǎng)絡庫。
multiprocessing-(Python 標準庫)基于進程的并行性。
scoop -Python 中的可伸縮并發(fā)操作。
uvloop - 在.NET 之上的 asyncio 事件循環(huán)的超快速實現(xiàn) libuv。
十四、任務隊列
用于處理任務隊列的庫。
celery- 基于分布式消息傳遞的異步任務隊列 / 作業(yè)隊列。
Dramatiq- 用于 Python 3 的快速可靠的后臺任務處理庫。
huey- 小多線程任務隊列。
mrq- 使用 Redis 和 gevent 的 Python 中的分布式工作者任務隊列。
rq -Python 的簡單作業(yè)隊列。
十五、自然語言處理
用于使用人類語言的圖書館。
一般的
gensim- 人類主題建模。
langid.py- 獨立的語言識別系統(tǒng)。
nltk- 用于構(gòu)建 Python 程序以使用人類語言數(shù)據(jù)的領先平臺。
pattern- 一個 Web 挖掘模塊。
polyglot- 支持數(shù)百種語言的自然語言管道。
pytext 的 - 基于 PyTorch 自然語言建模框架。
PyTorch-NLP- 一種工具包,可用于研究的快速深度學習 NLP 原型。
spacy - 一種用于 Python 和用 Cython 工業(yè)強度的自然語言處理庫。
Stanza -Stanford NLP Group 的官方 Python 庫,支持 60 多種語言。
中國人
funNLP- 中國 NLP 的工具和數(shù)據(jù)集的集合。
jieba- 最受歡迎的中文文本分割庫。
pkuseg-python- 用于各種領域的中文分詞的工具包。
snownlp- 用于處理中文文本的庫。
十六、深度學習、機器學習、計算機視覺
神經(jīng)網(wǎng)絡和深度學習框架。另請參閱真棒深度學習。
caffe- 深度學習的快速開放框架。
keras- 一個高級神經(jīng)網(wǎng)絡庫,能夠在 TensorFlow 或 Theano 之上運行。
mxnet- 專為效率和靈活性而設計的深度學習框架。
pytorch- 具有強大 GPU 加速功能的 Python 中的張量和動態(tài)神經(jīng)網(wǎng)絡。
SerpentAI- 游戲代理框架。使用任何視頻游戲作為深度學習沙箱。
tensorflow- 由 Google 創(chuàng)建的最受歡迎的深度學習框架。
Theano- 一個用于快速數(shù)值計算的庫。
機器學習圖書館。另請參閱很棒的機器學習。
健身房 - 用于開發(fā)和比較強化學習算法的工具包。
H2O- 開源快速可擴展機器學習平臺。
指標 - 機器學習評估指標。
NuPIC -Numenta 智能計算平臺。
scikit-learn- 最受歡迎的機器學習 Python 庫。
Spark ML - Apache Spark 的可擴展機器學習庫。
vowpal_porpoise- 用于 Vowpal Wabbit 的輕量級 Python 包裝器。
xgboost- 一個可擴展,可移植和分布式的梯度增強庫。
MindsDB -MindsDB 是現(xiàn)有數(shù)據(jù)庫的開源 AI 層,可讓您使用標準查詢輕松地開發(fā),訓練和部署最新的機器學習模型。
計算機視覺圖書館。
EasyOCR- 支持 40 多種語言的即用型 OCR。
人臉識別 - 簡單的人臉識別庫。
Kornia - PyTorch 的開源可區(qū)分計算機視覺庫。
OpenCV- 開源計算機視覺庫。
pytesseract - Google Tesseract OCR 的包裝。
SimpleCV- 用于構(gòu)建計算機視覺應用程序的開源框架。
tesserocr-tesseract-ocr 用于 OCR 的 API 的另一種簡單,對枕頭友好的包裝。
十七、數(shù)據(jù)分析、可視化
用于數(shù)據(jù)分析的庫。
AWS Data Wrangler -AWS 上的 Pandas。
Blaze -NumPy 和 Pandas 連接到大數(shù)據(jù)。
Pandas 界面中的 Open Mining- 商業(yè)智能(BI)。
Optimus –敏捷數(shù)據(jù)科學的工作流程變得容易與 PySpark。
Orange –通過可視化編程或腳本進行數(shù)據(jù)挖掘,數(shù)據(jù)可視化,分析和機器學習。
Pandas- 一個提供高性能,易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具的庫。
用于可視化數(shù)據(jù)的庫。另請參閱 awesome-javascript。
Altair- 用于 Python 的聲明性統(tǒng)計可視化庫。
Bokeh- 用于 Python 的交互式 Web 繪圖。
bqplot -Jupyter Notebook 的交互式繪圖庫
Cartopy- 具有 matplotlib 支持的制圖 python 庫
短跑 - 建立在燒瓶頂部,反應,Plotly 旨在分析 Web 應用程序。
很棒的破折號
圖表 - 圖表為代碼。
Matplotlib- 一個 Python 2D 繪圖庫。
plotnine- 基于 ggplot2 的 Python 圖形語法。
Pygal- 一個 Python SVG 圖表創(chuàng)建器。
PyGraphviz - Graphviz 的 Python 接口。
PyQtGraph- 交互式和實時 2D / 3D / 圖像繪制以及科學 / 工程小部件。
Seaborn - 使用 Matplotlib 統(tǒng)計數(shù)據(jù)可視化。
VisPy- 基于 OpenGL 的高性能科學可視化。
十八、數(shù)據(jù)庫驅(qū)動程序
用于連接和操作數(shù)據(jù)庫的庫。
MySQL- 很棒的 MySQL
mysqlclient- 支持 Python 3 的 MySQL 連接器(mysql-python fork)。
PyMySQL- 與 mysql-python 兼容的純 Python MySQL 驅(qū)動程序。
PostgreSQL- 很棒的 Postgres
psycopg2- 最受歡迎的 Python PostgreSQL 適配器。
查詢 -psycopg2 庫的包裝,用于與 PostgreSQL 交互。
SQlite- 很棒的 SQLite
sqlite3-(Python 標準庫)與 DB-API 2.0 兼容的 SQlite 接口
SuperSQLite- 建立在 apsw 之上的增壓 SQLite 庫。
其他關系數(shù)據(jù)庫
pymssql -Microsoft SQL Server 的簡單數(shù)據(jù)庫接口。
clickhouse-driver- 具有 ClickHouse 本地接口的 Python 驅(qū)動程序。
NoSQL 數(shù)據(jù)庫
cassandra-driver -Apache Cassandra 的 Python 驅(qū)動程序。
happybase -Apache HBase 的開發(fā)人員友好型庫。
kafka-python -Apache Kafka 的 Python 客戶端。
py2neo- 用于 Neo4j 的客戶端庫和工具包。
pymongo -MongoDB 的官方 Python 客戶端。
redis-py -Redis 的 Python 客戶端。
異步客戶端
motor -MongoDB 的異步 Python 驅(qū)動程序。
十九、DevOps 工具
DevOps 的軟件和庫。
配置管理
ansible- 一個非常簡單的 IT 自動化平臺。
cloudinit- 一個多分發(fā)包,用于處理云實例的早期初始化。
OpenStack- 用于構(gòu)建私有和公共云的開源軟件。
pyinfra- 通用的 CLI 工具和 python 庫,可自動執(zhí)行基礎架構(gòu)。
saltstack- 基礎結(jié)構(gòu)自動化和管理系統(tǒng)。
SSH 樣式的部署
cuisine - 類似于 Fabric 的廚師功能。
fabric - 一個簡單的,Python 化工具,用于遠程執(zhí)行和部署。
fabtools- 編寫很棒的 Fabric 文件的工具。
流程管理
honcho - Foreman 的 Python 克隆,用于管理基于 Procfile 的應用程序。
supervisor - 用于 UNIX 監(jiān)事過程控制系統(tǒng)。
監(jiān)控方式
psutil- 跨平臺的流程和系統(tǒng)實用程序模塊。
后備
BorgBackup- 具有壓縮和加密功能的重復數(shù)據(jù)刪除存檔器。
其他
docker- compose- 使用 Docker 的快速隔離開發(fā)環(huán)境。
二十、分布式計算
分布式計算的框架和庫。
批量處理
dask- 用于分析計算的靈活并行計算庫。
luigi- 一個模塊,可幫助您構(gòu)建批處理作業(yè)的復雜管道。
mrjob- 在 Hadoop 或 Amazon Web Services 上運行 MapReduce 作業(yè)。
PySpark - Apache Spark Python API。
Ray- 用于并行和分布式 Python 的系統(tǒng),統(tǒng)一了機器學習生態(tài)系統(tǒng)。
流處理
faust- 流處理庫,將想法從 Kafka Streams 移植到 Python。
streamparse- 通過 Apache Storm 針對實時數(shù)據(jù)流運行 Python 代碼。
二十一、配置、打包構(gòu)建
用于存儲和解析配置選項的庫。
configobj- 帶有驗證的 INI 文件解析器。
configparser-(Python 標準庫)INI 文件解析器。
hydra -Hydra 是用于優(yōu)雅配置復雜應用程序的框架。
profig- 使用值轉(zhuǎn)換從多種格式進行配置。
python-decouple- 嚴格將設置與代碼分開。
用于創(chuàng)建打包的可執(zhí)行文件以進行發(fā)行的庫。
dh-virtualenv- 以 Debian 軟件包的形式構(gòu)建和分發(fā) virtualenv。
Nuitka - 將腳本,模塊,程序包編譯為可執(zhí)行文件或擴展模塊。
py2app- 凍結(jié) Python 腳本(Mac OS X)。
py2exe- 凍結(jié) Python 腳本(Windows)。
pyarmor- 一種用于混淆 python 腳本,將混淆后的腳本綁定到固定計算機或使混淆后的腳本失效的工具。
PyInstaller- 將 Python 程序轉(zhuǎn)換為獨立的可執(zhí)行文件(跨平臺)。
pynsist- 用于構(gòu)建 Windows 安裝程序的工具,安裝程序?qū)?Python 本身捆綁在一起。
shiv- 命令行實用程序,用于構(gòu)建完全獨立的 zipapp(PEP 441),但包括其所有依賴項。
二十二、虛擬環(huán)境
用于 Python 版本和虛擬環(huán)境管理的庫。
pyenv- 簡單的 Python 版本管理。
virtualenv- 創(chuàng)建隔離的 Python 環(huán)境的工具。
二十三、界面開發(fā)
用于處理圖形用戶界面應用程序的庫。
curses - - 內(nèi)置包裝器 ncurses 的用于創(chuàng)建終端 GUI 的應用程序。
Eel- 一個用于制作簡單的類似于電子的脫機 HTML / JS GUI 應用程序的庫。
enaml- 使用聲明性語法(如 QML)創(chuàng)建漂亮的用戶界面。
Flexx -Flexx 是用于創(chuàng)建 GUI 的純 Python 工具包,它使用 Web 技術進行呈現(xiàn)。
Gooey - 使用命令行將命令行程序轉(zhuǎn)換為完整的 GUI 應用程序。
kivy- 用于創(chuàng)建 NUI 應用程序的庫,可在 Windows,Linux,Mac OS X,Android 和 iOS 上運行。
pyglet -Python 的跨平臺窗口和多媒體庫。
PyGObject -GLib / GObject / GIO / GTK +(GTK + 3)的 Python 綁定。
PyQt - Qt 跨平臺應用程序和 UI 框架的 Python 綁定。
PySimpleGUI - tkinter,Qt,WxPython 和 Remi 的包裝。
pywebview- 圍繞 webview 組件的輕量級跨平臺本機包裝器。
Tkinter -Tkinter 是 Python 的事實上的標準 GUI 軟件包。
Toga -Python 本機,OS 本機 GUI 工具箱。
urwid- 一個用于創(chuàng)建終端 GUI 應用程序的庫,該庫對小部件,事件,豐富的顏色等具有強大的支持。
wxPython -wxWidgets C ++ 類庫與 Python 的混合。
DearPyGui- 一個簡單的 GPU 加速的 Python GUI 框架
二十四、游戲開發(fā)
很棒的游戲開發(fā)庫。
Arcade -Arcade 是一個現(xiàn)代 Python 框架,用于制作具有引人注目的圖形和聲音的游戲。
Cocos2d -cocos2d 是用于構(gòu)建 2D 游戲,演示和其他圖形 / 交互應用程序的框架。
Harfang3D- 用于 3D,VR 和游戲開發(fā)的 Python 框架。
Panda3D- 迪士尼開發(fā)的 3D 游戲引擎。
Pygame -Pygame 是一組旨在編寫游戲的 Python 模塊。
PyOgre -Ogre 3D 渲染引擎的 Python 綁定,可用于游戲,模擬或任何 3D。
PyOpenGL -OpenGL 及其相關 API 的 Python ctypes 綁定。
PySDL2 -SDL2 庫的基于 ctypes 的包裝器。
RenPy- 一個視覺小說引擎
二十五、任務調(diào)度器
用于計劃作業(yè)的庫。
Airflow 氣流是一個以編程方式編寫,安排和監(jiān)視工作流的平臺。
APScheduler- 輕巧但功能強大的進程內(nèi)任務計劃程序,可讓您計劃功能。
django-schedule -Django 的日歷應用程序。
doit- 一個任務運行器和構(gòu)建工具。
gunnery - 具有基于 Web 界面的分布式系統(tǒng)的多用途任務執(zhí)行工具。
Joblib- 一套在 Python 中提供輕量級流水線的工具。
Plan - 像用吊飾一樣用 Python 編寫 crontab 文件。
Prefect- 一個現(xiàn)代的工作流程編排框架,可輕松構(gòu)建,調(diào)度和監(jiān)視強大的數(shù)據(jù)管道。
schedule- 針對人類的 Python 作業(yè)調(diào)度。
Spiff- 用純 Python 實現(xiàn)的功能強大的工作流引擎。
TaskFlow- 一個 Python 庫,可幫助簡化,一致且可靠的任務執(zhí)行
二十六、科學計算
用于科學計算的圖書館。另請參見 Python for-Scientists。
astropy- 天文學的社區(qū) Python 庫。
bcbio-nextgen- 提供最佳實踐流水線,用于全自動高通量測序分析。
bccb- 收集與生物學分析有關的有用代碼。
Biopython -Biopython 是一套免費的生物計算工具。
cclib- 一個用于解析和解釋計算化學程序包結(jié)果的庫。
Colour - 實施大量的顏色理論轉(zhuǎn)換和算法。
Karate Club - 用于圖形結(jié)構(gòu)化數(shù)據(jù)的無監(jiān)督機器學習工具箱。
NetworkX- 用于復雜網(wǎng)絡的高生產(chǎn)率軟件。
NIPY- 神經(jīng)影像工具箱的集合。
NumPy- 使用 Python 進行科學計算的基本軟件包。
ObsPy- 地震學的 Python 工具箱。
Open Babel- 一種化學工具箱,旨在講多種化學數(shù)據(jù)語言。
PyDy -Python Dynamics 的縮寫,用于協(xié)助工作流進行動態(tài)運動建模。
PyMC- 馬爾可夫鏈蒙特卡洛采樣工具包。
QuTiP -Python 中的 Quantum Toolbox。
RDKit- 化學信息學和機器學習軟件。
SciPy- 用于數(shù)學,科學和工程的基于 Python 的開源軟件生態(tài)系統(tǒng)。
SimPy- 一個基于過程的離散事件模擬框架。
statsmodels -Python 中的統(tǒng)計建模和計量經(jīng)濟學。
SymPy- 一個用于符號數(shù)學的 Python 庫。
Zipline- 一個 Pythonic 算法交易庫。
RPC
RPC 兼容服務器。
RPyC(遠程 Python 調(diào)用)- 用于 Python 的透明且對稱的 RPC 庫
zeroRPC -zerorpc 是基于 ZeroMQ 和 MessagePack 的靈活 RPC 實現(xiàn)。
數(shù)據(jù)文摘投稿作品
作者:丁彥軍
剛剛,
被《啥是佩奇》這支廣告片刷屏了。
佩奇明明是個喜劇角色,
卻看哭了所有人。
▼
啥是佩奇
https://v.qq.com/x/page/m0828x153iv.html
快過年了
在農(nóng)村爺爺給城里的小孫子打電話
小孫子說想要“佩奇”
為了滿足小孫子的愿望
爺爺開始滿村子找佩奇
開片爺爺在電話這頭的一段話就很抓人心,
全世界的爺爺都是這樣疼孫兒的,
一下子就讓觀眾有共情的心理。
一句“什么是佩奇?”
鋪墊了爺爺接下來的一段尋找佩奇之路,
最后爺爺找到的佩奇骨絡清奇,
卻是圈主見過的全世界最可愛的小豬佩奇!
不知道大家看完什么感覺
反正我看完是哭了
我看網(wǎng)友們也紛紛留言
說自己哭笑兩重奏
看著爺爺滿村子找佩奇,我有點心疼了。為此我想用純粹的Python來告訴爺爺,啥是佩奇?
先看看效果視頻:
https://v.qq.com/x/page/c1341vh69yx.html
基本思路:選好畫板大小,設置好畫筆顏色,粗細,定位好位置,依次畫鼻子,頭、耳朵,眼睛,腮,嘴,身體,手腳,尾巴,完事。
都知道,turtle 是 python 內(nèi)置的一個比較有趣味的模塊,俗稱 海龜繪圖,它是基于 tkinter 模塊打造,提供一些簡單的繪圖工具。
在海龜作圖中,我們可以編寫指令讓一個虛擬的(想象中的)海龜在屏幕上來回移動。這個海龜帶著一只鋼筆,我們可以讓海龜無論移動到哪都使用這只鋼筆來繪制線條。通過編寫代碼,以各種很酷的模式移動海龜,我們可以繪制出令人驚奇的圖片。使用海龜作圖,我們不僅能夠只用幾行代碼就創(chuàng)建出令人印象深刻的視覺效果,而且還可以跟隨海龜看看每行代碼如何影響到它的移動。這能夠幫助我們理解代碼的邏輯。所以海龜作圖也常被用作新手學習 Python 的一種方式。更豐富詳細的功能及知識可以參考官方文檔:
https://docs.python.org/3/library/turtle.html
了解了tuttle的用法之后就可以開始實戰(zhàn)了。
代碼示例:
from turtle import* def nose(x,y):#鼻子 penup()#提起筆 goto(x,y)#定位 pendown()#落筆,開始畫 setheading(-30)#將烏龜?shù)姆较蛟O置為to_angle/為數(shù)字(0-東、90-北、180-西、270-南) begin_fill()#準備開始填充圖形 a=0.4 for i in range(120): if 0<=i<30 or 60<=i<90: a=a+0.08 left(3) #向左轉(zhuǎn)3度 forward(a) #向前走a的步長 else: a=a-0.08 left(3) forward(a) end_fill()#填充完成 penup() setheading(90) forward(25) setheading(0) forward(10) pendown() pencolor(255,155,192)#畫筆顏色 setheading(10) begin_fill() circle(5) color(160,82,45)#返回或設置pencolor和fillcolor end_fill() penup() setheading(0) forward(20) pendown() pencolor(255,155,192) setheading(10) begin_fill() circle(5) color(160,82,45) end_fill() def head(x,y):#頭 color((255,155,192),"pink") penup() goto(x,y) setheading(0) pendown() begin_fill() setheading(180) circle(300,-30) circle(100,-60) circle(80,-100) circle(150,-20) circle(60,-95) setheading(161) circle(-300,15) penup() goto(-100,100) pendown() setheading(-30) a=0.4 for i in range(60): if 0<=i<30 or 60<=i<90: a=a+0.08 lt(3) #向左轉(zhuǎn)3度 fd(a) #向前走a的步長 else: a=a-0.08 lt(3) fd(a) end_fill() def cheek(x,y):#腮 color((255,155,192)) penup() goto(x,y) pendown() setheading(0) begin_fill() circle(30) end_fill() def mouth(x,y): #嘴 color(239,69,19) penup() goto(x,y) pendown() setheading(-80) circle(30,40) circle(40,80) def setting(): #參數(shù)設置 pensize(4) hideturtle() #使烏龜無形(隱藏) colormode(255) #將其設置為1.0或255.隨后 顏色三元組的r,g,b值必須在0 .. cmode范圍內(nèi) color((255,155,192),"pink") setup(840,500) speed(10) def main(): setting() #畫布、畫筆設置 nose(-100,100) #鼻子 head(-69,167) #頭 ears(0,160) #耳朵 eyes(0,140) #眼睛 cheek(80,10) #腮 mouth(-20,30) #嘴 done() if __name__=='__main__': main()
思路其實很簡單,就是通過trutle模塊實現(xiàn)基本的圓,橢圓,曲線等,難點在于,如何定位每個部位的位置(建議先草圖畫畫)。
完整代碼需要300行,為了限于篇幅,只放了一部分代碼,需要完整源碼的盆友,可關注大數(shù)據(jù)文摘微信公眾號,回復佩奇可獲得。
元測試(Unit Testing)
為程序編寫測試——如果做的到位——有助于減少bug的出現(xiàn),并可以提高我們對程序按預期目標運行的信心。通常,測試并不能保證正確性,因為對大多數(shù)程序而言, 可能的輸入范圍以及可能的計算范圍是如此之大,只有其中最小的一部分能被實際地進 行測試。盡管如此,通過仔細地選擇測試的方法和目標,可以提高代碼的質(zhì)量。
大量不同類型的測試都可以進行,比如可用性測試、功能測試以及整合測試等。這里, 我們只講單元測試一對單獨的函數(shù)、類與方法進行測試,確保其符合預期的行為。
TDD的一個關鍵點是,當我們想添加一個功能時——比如為類添加一個方法—— 我們首次為其編寫一個測試用例。當然,測試將失敗,因為我們還沒有實際編寫該方法。現(xiàn)在,我們編寫該方法,一旦方法通過了測試,就可以返回所有測試,確保我們新添加的代碼沒有任何預期外的副作用。一旦所有測試運行完畢(包括我們?yōu)樾鹿δ芫帉懙臏y試),就可以對我們的代碼進行檢查,并有理有據(jù)地相信程序行為符合我們的期望——當然,前提是我們的測試是適當?shù)摹?/p>
比如,我們編寫了一個函數(shù),該函數(shù)在特定的索引位置插入一個字符串,可以像下面這樣開始我們的TDD:
def insert_at(string, position, insert):
"""Returns a copy of string with insert inserted at the position
>>> string="ABCDE"
>>> result=[]
>>> for i in range(-2, len(string) + 2):
... result.append(insert_at(string, i,“-”))
>>> result[:5]
['ABC-DE', 'ABCD-E', '-ABCDE','A-BCDE', 'AB-CDE']
>>> result[5:]
['ABC-DE', 'ABCD-E', 'ABCDE-', 'ABCDE-']
"""
return string
對不返回任何參數(shù)的函數(shù)或方法(通常返回None),我們通常賦予其由pass構(gòu)成的一個suite,對那些返回值被試用的,我們或者返回一個常數(shù)(比如0),或者某個不變的參數(shù)——這也是我們這里所做的。(在更復雜的情況下,返回fake對象可能更有用一一對這樣的類,提供mock對象的第三方模塊是可用的。)
運行doctest時會失敗,并列出每個預期內(nèi)的字符串('ABCD-EF'、'ABCDE-F' 等),及其實際獲取的字符串(所有的都是'ABCD-EF')。一旦確定doctest是充分的和正確的,就可以編寫該函數(shù)的主體部分,在本例中只是簡單的return string[:position] + insert+string[position:]。(如果我們編寫的是 return string[:position] + insert,之后復制 string [:position]并將其粘貼在末尾以便減少一些輸入操作,那么doctest會立即提示錯誤。)
Python的標準庫提供了兩個單元測試模塊,一個是doctest,這里和前面都簡單地提到過,另一個是unittest。此外,還有一些可用于Python的第三方測試工具。其中最著名的兩個是nose (code.google.com/p/python-nose)與py.test (codespeak.net/py/dist/test/test.html), nose 致力于提供比標準的unittest 模塊更廣泛的功能,同時保持與該模塊的兼容性,py.test則采用了與unittest有些不同的方法,試圖盡可能消除樣板測試代碼。這兩個第三方模塊都支持測試發(fā)現(xiàn),因此沒必要寫一個總體的測試程序——因為模塊將自己搜索測試程序。這使得測試整個代碼樹或某一部分 (比如那些已經(jīng)起作用的模塊)變得很容易。那些對測試嚴重關切的人,在決定使用哪個測試工具之前,對這兩個(以及任何其他有吸引力的)第三方模塊進行研究都是值 得的。
創(chuàng)建doctest是直截了當?shù)模何覀冊谀K中編寫測試、函數(shù)、類與方法的docstrings。 對于模塊,我們簡單地在末尾添加了 3行:
if __name__=="__main__":
import doctest
doctest.testmod()
在程序內(nèi)部使用doctest也是可能的。比如,blocks.py程序(其模塊在后面)有自己函數(shù)的doctest,但以如下代碼結(jié)尾:
if __name__=="__main__":
main()
這里簡單地調(diào)用了程序的main()函數(shù),并且沒有執(zhí)行程序的doctest。要實驗程序的 doctest,有兩種方法。一種是導入doctest模塊,之后運行程序---比如,在控制臺中輸 入 python3 -m doctest blocks.py (在 Wndows 平臺上,使用類似于 C:\Python3 l\python.exe 這樣的形式替代python3)。如果所有測試運行良好,就沒有輸出,因此,我們可能寧愿執(zhí)行python3-m doctest blocks.py-v,因為這會列出每個執(zhí)行的doctest,并在最后給出結(jié)果摘要。
另一種執(zhí)行doctest的方法是使用unittest模塊創(chuàng)建單獨的測試程序。在概念上, unittest模塊是根據(jù)Java的JUnit單元測試庫進行建模的,并用于創(chuàng)建包含測試用例的測試套件。unittest模塊可以基于doctests創(chuàng)建測試用例,而不需要知道程序或模塊包含的任何事物——只要知道其包含doctest即可。因此,為給blocks.py程序制作一個測試套件,我們可以創(chuàng)建如下的簡單程序(將其稱為test_blocks.py):
import doctest
import unittest
import blocks
suite=unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(blocks))
runner=unittest.TextTestRunner()
print(runner.run(suite))
注意,如果釆用這種方法,程序的名稱上會有一個隱含的約束:程序名必須是有效的模塊名。因此,名為convert-incidents.py的程序的測試不能寫成這樣。因為import convert-incidents不是有效的,在Python標識符中,連接符是無效的(避開這一約束是可能的,但最簡單的解決方案是使用總是有效模塊名的程序文件名,比如,使用下劃線替換連接符)。這里展示的結(jié)構(gòu)(創(chuàng)建一個測試套件,添加一個或多個測試用例或測試套件,運行總體的測試套件,輸出結(jié)果)是典型的機遇unittest的測試。運行時,這一特定實例產(chǎn)生如下結(jié)果:
...
.............................................................................................................
Ran 3 tests in 0.244s
OK
<unittest._TextTestResult run=3 errors=0 failures=0>
每次執(zhí)行一個測試用例時,都會輸出一個句點(因此上面的輸出最前面有3個句點),之后是一行連接符,再之后是測試摘要(如果有任何一個測試失敗,就會有更多的輸出信息)。
如果我們嘗試將測試分離開(典型情況下是要測試的每個程序和模塊都有一個測試用例),就不要再使用doctests,而是直接使用unittest模塊的功能——尤其是我們習慣于使用JUnit方法進行測試時ounittest模塊會將測試分離于代碼——對大型項目(測試編寫人員與開發(fā)人員可能不一致)而言,這種方法特別有用。此外,unittest單元測試編寫為獨立的Python模塊,因此,不會像在docstring內(nèi)部編寫測試用例時受到兼容性和明智性的限制。
unittest模塊定義了 4個關鍵概念。測試夾具是一個用于描述創(chuàng)建測試(以及用完之后將其清理)所必需的代碼的術語,典型實例是創(chuàng)建測試所用的一個輸入文件,最后刪除輸入文件與結(jié)果輸出文件。測試套件是一組測試用例的組合。測試用例是測試的基本單元—我們很快就會看到實例。測試運行者是執(zhí)行一個或多個測試套件的對象。
典型情況下,測試套件是通過創(chuàng)建unittest.TestCase的子類實現(xiàn)的,其中每個名稱 以“test”開頭的方法都是一個測試用例。如果我們需要完成任何創(chuàng)建操作,就可以在一個名為setUp()的方法中實現(xiàn);類似地,對任何清理操作,也可以實現(xiàn)一個名為 tearDown()的方法。在測試內(nèi)部,有大量可供我們使用的unittest.TestCase方法,包括 assertTrue()、assertEqual()、assertAlmostEqual()(對于測試浮點數(shù)很有用)、assertRaises() 以及更多,還包括很多對應的逆方法,比如assertFalse()、assertNotEqual()、failIfEqual()、 failUnlessEqual ()等。
unittest模塊進行了很好的歸檔,并且提供了大量功能,但在這里我們只是通過一 個非常簡單的測試套件來感受一下該模塊的使用。這里將要使用的實例,該練習要求創(chuàng)建一個Atomic模塊,該模塊可以用作一 個上下文管理器,以確保或者所有改變都應用于某個列表、集合或字典,或者所有改變都不應用。作為解決方案提供的Atomic.py模塊使用30行代碼來實現(xiàn)Atomic類, 并提供了 100行左右的模塊doctest。這里,我們將創(chuàng)建test_Atomic.py模塊,并使用 unittest測試替換doctest,以便可以刪除doctest。
在編寫測試模塊之前,我們需要思考都需要哪些測試。我們需要測試3種不同的數(shù)據(jù)類型:列表、集合與字典。對于列表,需要測試的是插入項、刪除項或修改項的值。對于集合,我們必須測試向其中添加或刪除一個項。對于字典,我們必須測試的是插入一個項、修改一個項的值、刪除一個項。此外,還必須要測試的是在失敗的情況下,不會有任何改變實際生效。
結(jié)構(gòu)上看,測試不同數(shù)據(jù)類型實質(zhì)上是一樣的,因此,我們將只為測試列表編寫測試用例,而將其他的留作練習。test_Atomic.py模塊必須導入unittest模塊與要進行測試的Atomic模塊。
創(chuàng)建unittest文件時,我們通常創(chuàng)建的是模塊而非程序。在每個模塊內(nèi)部,我們定義一個或多個unittest.TestCase子類。比如,test_Atomic.py模塊中僅一個單獨的 unittest-TestCase子類,也就是TestAtomic (稍后將對其進行講解),并以如下兩行結(jié)束:
if name=="__main__":
unittest.main()
這兩行使得該模塊可以單獨運行。當然,該模塊也可以被導入并從其他測試程序中運行——如果這只是多個測試套件中的一個,這一點是有意義的。
如果想要從其他測試程序中運行test_Atomic.py模塊,那么可以編寫一個與此類似的程序。我們習慣于使用unittest模塊執(zhí)行doctests,比如:
import unittest
import test_Atomic
suite=unittest.TestLoader().loadTestsFromTestCase(test_Atomic.TestAtomic)
runner=unittest.TextTestRunner()
pnnt(runner.run(suite))
這里,我們已經(jīng)創(chuàng)建了一個單獨的套件,這是通過讓unittest模塊讀取test_Atomic 模塊實現(xiàn)的,并且使用其每一個test*()方法(本實例中是test_list_success()、test_list_fail(),稍后很快就會看到)作為測試用例。
我們現(xiàn)在將查看TestAtomic類的實現(xiàn)。對通常的子類(不包括unittest.TestCase 子類),不怎么常見的是,沒有必要實現(xiàn)初始化程序。在這一案例中,我們將需要建立 一個方法,但不需要清理方法,并且我們將實現(xiàn)兩個測試用例。
def setUp(self):
self.original_list=list(range(10))
我們已經(jīng)使用了 unittest.TestCase.setUp()方法來創(chuàng)建單獨的測試數(shù)據(jù)片段。
def test_list_succeed(self):
items=self.original_list[:]
with Atomic.Atomic(items) as atomic:
atomic.append(1999)
atomic.insert(2, -915)
del atomic[5]
atomic[4]=-782
atomic.insert(0, -9)
self.assertEqual(items,
[-9, 0, 1, -915, 2, -782, 5, 6, 7, 8, 9, 1999])
def test_list_fail(self):
items=self.original_list[:]
with self.assertRaises(AttributeError):
with Atomic.Atomic(items) as atomic:
atomic.append(1999)
atomic.insert(2, -915)
del atomic[5]
atomic[4]=-782
atomic.poop() # Typo
self.assertListEqual(items, self.original_list)
這里,我們直接在測試方法中編寫了測試代碼,而不需要一個內(nèi)部函數(shù),也不再使用unittest.TestCase.assertRaised()作為上下文管理器(期望代碼產(chǎn)生AttributeError)。 最后我們也使用了 Python 3.1 的 unittest.TestCase.assertListEqual()方法。
正如我們已經(jīng)看到的,Python的測試模塊易于使用,并且極為有用,在我們使用 TDD的情況下更是如此。它們還有比這里展示的要多得多的大量功能與特征——比如,跳過測試的能力,這有助于理解平臺差別——并且這些都有很好的文檔支持。缺失的一個功能——但nose與py.test提供了——是測試發(fā)現(xiàn),盡管這一特征被期望在后續(xù)的Python版本(或許與Python 3.2—起)中出現(xiàn)。
性能剖析(Profiling)
如果程序運行很慢,或者消耗了比預期內(nèi)要多得多的內(nèi)存,那么問題通常是選擇的算法或數(shù)據(jù)結(jié)構(gòu)不合適,或者是以低效的方式進行實現(xiàn)。不管問題的原因是什么, 最好的方法都是準確地找到問題發(fā)生的地方,而不只是檢査代碼并試圖對其進行優(yōu)化。 隨機優(yōu)化會導致引入bug,或者對程序中本來對程序整體性能并沒有實際影響的部分進行提速,而這并非解釋器耗費大部分時間的地方。
在深入討論profiling之前,注意一些易于學習和使用的Python程序設計習慣是有意義的,并且對提高程序性能不無裨益。這些技術都不是特定于某個Python版本的, 而是合理的Python程序設計風格。第一,在需要只讀序列時,最好使用元組而非列表; 第二,使用生成器,而不是創(chuàng)建大的元組和列表并在其上進行迭代處理;第三,盡量使用Python內(nèi)置的數(shù)據(jù)結(jié)構(gòu) dicts、lists、tuples 而不實現(xiàn)自己的自定義結(jié)構(gòu),因為內(nèi)置的數(shù)據(jù)結(jié)構(gòu)都是經(jīng)過了高度優(yōu)化的;第四,從小字符串中產(chǎn)生大字符串時, 不要對小字符串進行連接,而是在列表中累積,最后將字符串列表結(jié)合成為一個單獨的字符串;第五,也是最后一點,如果某個對象(包括函數(shù)或方法)需要多次使用屬性進行訪問(比如訪問模塊中的某個函數(shù)),或從某個數(shù)據(jù)結(jié)構(gòu)中進行訪問,那么較好的做法是創(chuàng)建并使用一個局部變量來訪問該對象,以便提供更快的訪問速度。
Python標準庫提供了兩個特別有用的模塊,可以輔助調(diào)査代碼的性能問題。一個是timeit模塊——該模塊可用于對一小段Python代碼進行計時,并可用于諸如對兩個或多個特定函數(shù)或方法的性能進行比較等場合。另一個是cProfile模塊,可用于profile 程序的性能——該模塊對調(diào)用計數(shù)與次數(shù)進行了詳細分解,以便發(fā)現(xiàn)性能瓶頸所在。
為了解timeit模塊,我們將查看一些小實例。假定有3個函數(shù)function_a()、 function_b()、function_c(), 3個函數(shù)執(zhí)行同樣的計算,但分別使用不同的算法。如果將這些函數(shù)放于同一個模塊中(或分別導入),就可以使用timeit模塊對其進行運行和比較。下面給出的是模塊最后使用的代碼:
if __name__=="__main__":
repeats=1000
for function in ("function_a", "function_b", "function_c"):
t=timeit.Timer("{0}(X, Y)".format(function),"from __main__ import {0}, X, Y".format(function))
sec=t.timeit(repeats) / repeats
print("{function}() {sec:.6f} sec".format(**locals()))
賦予timeit.Timer()構(gòu)造子的第一個參數(shù)是我們想要執(zhí)行并計時的代碼,其形式是字符串。這里,該字符串是“function_a(X,Y)”;第二個參數(shù)是可選的,還是一個待執(zhí)行的字符串,這一次是在待計時的代碼之前,以便提供一些建立工作。這里,我們從 __main__ (即this)模塊導入了待測試的函數(shù),還有兩個作為輸入數(shù)據(jù)傳入的變量(X 與Y),這兩個變量在該模塊中是作為全局變量提供的。我們也可以很輕易地像從其他模塊中導入數(shù)據(jù)一樣來進行導入操作。
調(diào)用timeit.Timer對象的timeit()方法時,首先將執(zhí)行構(gòu)造子的第二個參數(shù)(如果有), 之后執(zhí)行構(gòu)造子的第一個參數(shù)并對其執(zhí)行時間進行計時。timeit.Timer.timeit()方法的返回值是以秒計數(shù)的時間,類型是float。默認情況下,timeit()方法重復100萬次,并返回所 有這些執(zhí)行的總秒數(shù),但在這一特定案例中,只需要1000次反復就可以給出有用的結(jié)果, 因此對重復計數(shù)次數(shù)進行了顯式指定。在對每個函數(shù)進行計時后,使用重復次數(shù)對總數(shù)進行除法操作,就得到了平均執(zhí)行時間,并在控制臺中打印出函數(shù)名與執(zhí)行時間。
function_a() 0.001618 sec
function_b() 0.012786 sec
function_c() 0.003248 sec
在這一實例中,function_a()顯然是最快的——至少對于這里使用的輸入數(shù)據(jù)而言。 在有些情況下一一比如輸入數(shù)據(jù)不同會對性能產(chǎn)生巨大影響——可能需要使用多組輸入數(shù)據(jù)對每個函數(shù)進行測試,以便覆蓋有代表性的測試用例,并對總執(zhí)行時間或平均執(zhí)行時間進行比較。
有時監(jiān)控自己的代碼進行計時并不是很方便,因此timeit模塊提供了一種在命令行中對代碼執(zhí)行時間進行計時的途徑。比如,要對MyModule.py模塊中的函數(shù)function_a()進行計時,可以在控制臺中輸入如下命令:python3 -m timeit -n 1000 -s "from MyModule import function_a, X, Y" "function_a(X, Y)"(與通常所做的一樣,對 Windows 環(huán)境,我們必須使用類似于C:\Python3l\python.exe這樣的內(nèi)容來替換python3)。-m選項用于Python 解釋器,使其可以加載指定的模塊(這里是timeit),其他選項則由timeit模塊進行處理。 -n選項指定了循環(huán)計數(shù)次數(shù),-s選項指定了要建立,最后一個參數(shù)是要執(zhí)行和計時的代碼。命令完成后,會向控制臺中打印運行結(jié)果,比如:
1000 loops, best of 3: 1.41 msec per loop
之后我們可以輕易地對其他兩個函數(shù)進行計時,以便對其進行整體的比較。
cProfile模塊(或者profile模塊,這里統(tǒng)稱為cProfile模塊)也可以用于比較函數(shù) 與方法的性能。與只是提供原始計時的timeit模塊不同的是,cProfile模塊精確地展示 了有什么被調(diào)用以及每個調(diào)用耗費了多少時間。下面是用于比較與前面一樣的3個函數(shù)的代碼:
if __name__=="__main__":
for function in ("function_a", "function_b", "function_c"):
cProfile.run("for i in ranged 1000): {0}(X, Y)".format(function))
我們必須將重復的次數(shù)放置在要傳遞給cProfile.run()函數(shù)的代碼內(nèi)部,但不需要做任何創(chuàng)建,因為模塊函數(shù)會使用內(nèi)省來尋找需要使用的函數(shù)與變量。這里沒有使用顯式的print()語句,因為默認情況下,cProfile.run()函數(shù)會在控制臺中打印其輸出。下面給出的是所有函數(shù)的相關結(jié)果(有些無關行被省略,格式也進行了稍許調(diào)整,以便與頁面適應):
1003 function calls in 1.661 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.003 0.003 1.661 1.661 <string>:1 (<module>)
1000 1.658 0.002 1.658 0.002 MyModule.py:21 (function_a)
1 0.000 0.000 1.661 1.661 {built-in method exec}
5132003 function calls in 22.700 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.487 0.487 22.700 22.700 <string>: 1 (<module>)
1000 0.011 0.000 22.213 0.022 MyModule.py:28(function_b)
5128000 7.048 0.000 7.048 0.000 MyModule.py:29(<genexpr>)
1000 0.00 50.000 0.005 0.000 {built-in method bisectjeft}
1 0.000 0.000 22.700 22.700 {built-in method exec}
1000 0.001 0.000 0.001 0.000 {built-in method len}
1000 15.149 0.015 22.196 0.022 {built-in method sorted}
5129003 function calls in 12.987 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.205 0.205 12.987 12.987 <string>:l (<module>)
1000 6.472 0.006 12.782 0.013 MyModule.py:36(function_c)
5128000 6.311 0.000 6.311 0.000 MyModule.py:37(<genexpr>)
1 0.000 0.000 12.987 12.987 {built-in method exec}
ncalls ("調(diào)用的次數(shù)")列列出了對指定函數(shù)(在filename:lineno(function)中列出) 的調(diào)用次數(shù)。回想一下我們重復了 1000次調(diào)用,因此必須將這個次數(shù)記住。tottime (“總的時間”)列列出了某個函數(shù)中耗費的總時間,但是排除了函數(shù)調(diào)用的其他函數(shù)內(nèi)部花費的時間。第一個percall列列出了對函數(shù)的每次調(diào)用的平均時間(tottime // ncalls)。 cumtime ("累積時間")列出了在函數(shù)中耗費的時間,并且包含了函數(shù)調(diào)用的其他函數(shù)內(nèi)部花費的時間。第二個percall列列出了對函數(shù)的每次調(diào)用的平均時間,包括其調(diào)用的函數(shù)耗費的時間。
這種輸出信息要比timeit模塊的原始計時信息富有啟發(fā)意義的多。我們立即可以發(fā)現(xiàn),function_b()與function_c()使用了被調(diào)用5000次以上的生成器,使得它們的速度至少要比function_a()慢10倍以上。并且,function_b()調(diào)用了更多通常意義上的函數(shù),包括調(diào)用內(nèi)置的sorted()函數(shù),這使得其幾乎比function_c()還要慢兩倍。當然,timeit() 模塊提供了足夠的信息來查看計時上存在的這些差別,但cProfile模塊允許我們了解為什么會存在這些差別。正如timeit模塊允許對代碼進行計時而又不需要對其監(jiān)控一樣,cProfile模塊也可以做到這一點。然而,從命令行使用cProfile模塊時,我們不能精確地指定要執(zhí)行的 是什么——而只是執(zhí)行給定的程序或模塊,并報告所有這些的計時結(jié)果。需要使用的 命令行是python3 -m cProfile programOrModule.py,產(chǎn)生的輸出信息與前面看到的一 樣,下面給出的是輸出信息樣例,格式上進行了一些調(diào)整,并忽略了大多數(shù)行:
10272458 function calls (10272457 primitive calls) in 37.718 CPU secs
ncalls tottime percall cumtime percall filename:lineno(function)
10.000 0.000 37.718 37.718 <string>:1 (<module>)
10.719 0.719 37.717 37.717 <string>:12(<module>)
1000 1.569 0.002 1.569 0.002 <string>:20(function_a)
1000 0.011 0.000 22.560 0.023 <string>:27(function_b)
5128000 7.078 0.000 7.078 0.000 <string>:28(<genexpr>)
1000 6.510 0.007 12.825 0.013 <string>:35(function_c)
5128000 6.316 0.000 6.316 0.000 <string>:36(<genexpr>)
在cProfile術語學中,原始調(diào)用指的就是非遞歸的函數(shù)調(diào)用。
以這種方式使用cProfile模塊對于識別值得進一步研究的區(qū)域是有用的。比如,這里 我們可以清晰地看到function_b()需要耗費更長的時間,但是我們怎樣獲取進一步的詳細資料?我們可以使用cProfile.run("function_b()")來替換對function_b()的調(diào)用。或者可以保存完全的profile數(shù)據(jù)并使用pstats模塊對其進行分析。要保存profile,就必須對命令行進行稍許修改:python3 -m cProfile -o profileDataFile programOrModule.py。 之后可以對 profile 數(shù)據(jù)進行分析,比如啟動IDLE,導入pstats模塊,賦予其已保存的profileDataFile,或者也可以在控制臺中交互式地使用pstats。
下面給出的是一個非常短的控制臺會話實例,為使其適合頁面展示,進行了適當調(diào)整,我們自己的輸入則以粗體展示:
$ python3 -m cProfile -o profile.dat MyModule.py
$ python3 -m pstats
Welcome to the profile statistics browser.
% read profile.dat
profile.dat% callers function_b
Random listing order was used
List reduced from 44 to 1 due to restriction <'function_b‘>
Function was called by...
ncalls tottime cumtime
<string>:27(function_b) <- 1000 0.011 22.251 <string>:12(<module>)
profile.dat% callees function_b
Random listing order was used
List reduced from 44 to 1 due to restriction <'function_b'>
Function called...
ncalls tottime cumtime
<string>:27(function_b)->
1000 0.005 0.005 built-in method bisectJeft
1000 0.001 0.001 built-in method len
1000 1 5.297 22.234 built-in method sorted
profile.dat% quit
輸入help可以獲取命令列表,help后面跟隨命令名可以獲取該命令的更多信息。比如, help stats將列出可以賦予stats命令的參數(shù)。還有其他一些可用的工具,可以提供profile數(shù)據(jù)的圖形化展示形式,比如 RunSnakeRun (www.vrplumber.com/prograinming/runsnakerun), 該工具需要依賴于wxPython GUI庫。
使用timeit與cProfile模塊,我們可以識別出我們自己代碼中哪些區(qū)域會耗費超過預期的時間;使用cProfile模塊,還可以準確算岀時間消耗在哪里。
以上內(nèi)容部分摘自視頻課程05后端編程Python-19調(diào)試、測試和性能調(diào)優(yōu)(下),更多實操示例請參照視頻講解。跟著張員外講編程,學習更輕松,不花錢還能學習真本領。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。