整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          2021年python庫大全

          2021年python庫大全

          、算法設計

          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)(下),更多實操示例請參照視頻講解。跟著張員外講編程,學習更輕松,不花錢還能學習真本領。


          主站蜘蛛池模板: asmr国产一区在线| 无码人妻品一区二区三区精99 | 99精品国产高清一区二区| 精品国产一区二区三区在线| 亚欧成人中文字幕一区 | 老熟妇仑乱一区二区视頻| 一区二区三区四区精品| 亚洲精品无码一区二区| 色窝窝无码一区二区三区 | 日本道免费精品一区二区| 国产香蕉一区二区三区在线视频| 色狠狠一区二区三区香蕉| 在线观看午夜亚洲一区| 国产在线精品一区二区三区直播| 欧洲精品一区二区三区在线观看 | 日本一区二区在线播放| 日本亚洲国产一区二区三区| 久久精品国产一区二区电影| 国产亚洲福利一区二区免费看| eeuss鲁片一区二区三区| 无码中文人妻在线一区| 国产成人欧美一区二区三区| 中字幕一区二区三区乱码| 亚洲狠狠狠一区二区三区| 精品无人区一区二区三区| 国产电影一区二区| 无码少妇丰满熟妇一区二区| 黑巨人与欧美精品一区| 国产精品一区二区电影| 一区二区三区福利| 国产AV午夜精品一区二区三| 日韩精品无码一区二区三区四区| 亚洲av午夜福利精品一区| 久久国产免费一区二区三区| 精品国产一区二区三区麻豆| 国产精品无码一区二区在线观| 老鸭窝毛片一区二区三区| 国产亚洲情侣一区二区无| 久久久久久综合一区中文字幕| 麻豆AV一区二区三区| 无码丰满熟妇一区二区|