天天看點

python中的标準庫有哪些餐廳_Python 中最流行的十個标準庫

Python 是當今人工智能和機器學習領域最流行的程式設計語言之一。Python 以其有用的庫和包而著稱,即使沒有軟體工程背景的人也能程式設計。

Python 擁有一組與 Python 語言一起分發的标準庫,如 DateTime、math 或 Random。本文的目标是在 GitHub 的 Python 倉庫中找到 10 個最有用的标準庫。為實作我們的目标,我們研究了 GitHub 中不同的 Python 倉庫,并收集了它們的舊庫來回答這個問題。

為了開始我們的研究,首先,我們收集了 GitHub 中 5 個著名的 Python 資源庫在過去一年的送出情況。然後,我們對這些倉庫中的 Python 源檔案進行解析,并收集其送出中使用的庫。最後,我們将這些 GitHub 倉庫送出中使用的 10 個最流行的 Python 标準庫進行可視化。

如何收集資料?

有不同的方法可以通路 GitHub 倉庫中的資料,例如 GitHub torrent、Git API 調用或 Google big query。但是,在本文中,我們想要嘗試一個新的非常有用的 Python 包,名為Pydriller,它可以收集我們需要的資料。Pydriller 速度快,使用友善。我是在攻讀博士學位的時候熟悉了這個有趣的包。你可以在這裡檢視 Pydriller 的文檔。要從 Pydriller 開始,首先,我們安裝包:

pip install pydriller但在本文中,我們想嘗試一些不同的方法。我們比較兩個不同版本的源檔案“送出之前”和“送出之後”應用送出,然後收集這兩個檔案在庫名中的差異。

通過這種方法,我們就可以發現庫在不同送出中的使用頻率。好消息是,Pydriller 允許我們在應用送出之前和應用送出之後通路源檔案的版本。下面是收集資料所需的代碼:

#import librariesimport pydriller as pydfrom datetime import datetime#period to collect datadt1 = datetime(2019, 11, 1)dt2 = datetime(2020, 11, 1)#path of 5 Python repositoriespath = ["https://github.com/django/django.git","https://github.com/pandas-dev/pandas.git", "https://github.com/numpy/numpy","https://github.com/home-assistant/home-assistant.git", "https://github.com/donnemartin/system-design-primer.git"]#collecting a version of a source file before and after applying a committf_source = pd.DataFrame(columns=['commit_ID', 'before_Commit', 'after_Commit'])for commit in pyd.RepositoryMining(path_to_repo=path, since=dt1, to=dt2).traverse_commits(): for modified_file in commit.modifications: if modified_file.filename.endswith(".py"): tf_source = tf_source.append({'commit_ID': commit.hash,'before_Commit': modified_file.source_code_before, 'after_Commit': modified_file.source_code}, ignore_index=True)用 Pydriller 在 GitHub 中收集 5 個著名的 Python 庫。

我們在 GitHub 上收集了 5 個大的 Python 項目在去年的送出情況,其中有Django、Pandas、NumPy、Homeassistant、system-design-primer。“RepositoryMining”是 Pydriller 的主要 API 調用之一。

我們可以通過 RepositoryMining 中的兩個參數來定義一個時間段來收集不同倉庫中的送出:since和to。另外,我們考慮所有名稱以“.py”結尾的源檔案的送出,因為這些資源庫中也有其他程式設計語言的源檔案,但我們關注的是 Python 庫。

我們收集了三個特征:commit.hash、source_code_before、source_code。Pydriller 中的commit.hash傳回送出的id,source_code_before是應用送出前的源檔案版本,source_code則顯示送出後的源檔案内容。下面是我們收集的資料頭:

python中的标準庫有哪些餐廳_Python 中最流行的十個标準庫

tf_source.head()

到目前為止,我們已經收集了開始旅程所需的資料。在下一節中,我們将學習如何探索這些源檔案中的庫。

如何解析 Python 源代碼

提取源代碼中資訊的方法之一是将它們轉換成抽象文法樹(Abstract Syntax Tree,AST)。然後,我們就可以周遊這棵樹,并收集目标節點。

但最重要的一點是,我們隻想收集 Python 标準庫,而不是所有在倉庫中使用的包,比如本地定義的庫,它們隻有在倉庫中才有意義。Python 标準庫是和 Python 語言一起釋出的。

是以,為了将标準包和其他包分開,我們需要拉取 Python 中所有有效的标準庫。然後,我們可以寫一個函數來收集源代碼中的庫名。

我們可以将本節分為兩步:收集 Python 中所有可用的标準庫的清單、建構基于抽象文法書的函數來收集庫名。

1. 收集 Python 中所有可用的标準庫的清單

在Python 的網站上,有一張 Python 中所有标準庫的清單,并附有簡短說明。這個頁面将所有的 Python 标準庫按字母名稱排序,幫助我們對 Python 中所有的标準庫進行拉取。我把所有 Python 标準庫的清單放在這裡,以 .csv 的格式。

2. 建構基于抽象文法書的函數來收集庫名

既然我們有了所有标準 Python 庫的清單,我們就需要從 Python GitHub 倉庫中收集我們示例資料集中的庫名稱。正如我們提到的,其中一種方法是周遊抽象文法樹。

在本文中,我們的目标節點是import和importfrom。我們希望有一個函數周遊解析樹,找到目标節點,并傳回庫的名稱。下面是這樣做的類。

#import librariesimport astimport tokenize#A class to walk trough AST and collect libraries nameclass FuncParser(ast.NodeVisitor):def visit_Import(self, node):tempImpo = node.namesif(tempImpo != None):listImpo = tempImpo[0]Impo = listImpo.nameif (Impo in api_name):file_contents.append(Impo)ast.NodeVisitor.generic_visit(self, node)else:ast.NodeVisitor.generic_visit(self, node)def visit_ImportFrom(self, node):module=node.moduleif(module in api_name):file_contents.append(module)else:ast.NodeVisitor.generic_visit(self, node)def generic_visit(self, node):ast.NodeVisitor.generic_visit(self, node)在 Python 代碼中收集庫名的類。

為了更好地了解這個類的工作原理,下面是一段簡單的代碼。這段示例代碼隻有兩行,分别導入了兩個不同的庫,其中一個是 python 标準庫:tokenize,另一個是本地庫:assistant。

import tokenize as tzimport assistant as ass下面是這個示例代碼的解析樹的轉儲。可以發現,我們需要收集的是作為alias類中的name參數。

此外,我們還需要檢查庫的名稱是否在我們從 Python 原始網站收集的所有标準庫的清單中。我們将 .csv 檔案儲存在名為api_name的清單中。

如果我們在這個示例代碼上應用這個類FuncParser,它将隻傳回tokenize,因為另一個庫assistant在 Python 标準庫清單中不可用。

Module(body=[Import(names=[alias(name='tokenize', asname='tz')]), Import(names=[alias(name='assistant', asname='ass')])])Python 倉庫中基于 GitHub 送出的 10 個最流行的标準庫是什麼

到目前為止,我們收集了 GitHub 中 5 個著名的 Python 倉庫的示例資料集,并建構了一個類來收集 Python 代碼中的庫名。

現在,我們需要将這個函數應用到 GitHub 的示例資料中,并找出這些倉庫的送出中使用的前 10 個庫。正如我們前面所讨論的,我們将送出送出之前的源檔案的抽象文法樹和送出送出之後的同一源檔案的抽象文法樹進行比較,然後我們收集不同的庫節點。

然後我們收集不同的庫節點。首先,我會給大家展示一個步驟性的示例,告訴大家如何比較這兩個抽象文法樹,最後,我把所有的代碼放在一起,以循環周遊整個資料集,并計算每個庫的出現次數。

1. 送出送出之前收集庫名清單

我們将示例資料集存儲在tf_source中,我選擇這個資料集的第一行來解釋整個過程。tf_source'Commit_before'傳回示例資料集中第一次送出前的代碼内容。

然後,我們應用FuncParser()來收集這個源檔案中的所有庫名,并在file_contents清單中傳回結果。我們建立一個名為tokens_before的資料架構,并存儲這個清單。

text_before=str(tf_source[‘Commit_before’](0))bf_obj = FuncParser()bf_tree = ast.parse(text_before)file_contents = []bf_obj.visit(bf_tree)dtobj_before = pd.DataFrame(file_contents, columns=[‘token’])tokens_before =pd.DataFrame(dtobj_before[‘token’].value_counts())2. 送出送出之後收集庫名清單

我們重複與上面的步驟相同的過程,但這次是在送出送出之後對源檔案的内容進行的,tf_source‘Commit_after’。

另外,我們将結果存儲在一個名為tokens_after的資料幀中。

text_after=str(tf_source[‘Commit_after’](0)) aft_obj = FuncParser()aft_tree = ast.parse(text_after)file_contents = []aft_obj.visit(aft_tree)dtobj_after = pd.DataFrame(file_contents, columns=[‘token’])tokens_after =pd.DataFrame(dtobj_after[‘token’].value_counts())3. 找出這兩個清單之間的差異

在這一步中,我們從tokens_after中減去tokens_before以計算它們的差異。

diff = tokens_after.subtract(tokens_before)diff_token = diff[(diff.select_dtypes(include=[‘number’]) != 0).any(1)]diff_token=diff_token.fillna(0)diff_token= diff_token.abs()diff_token = diff_token.reset_index()4. 計算庫的數量

最後,我們統計每個庫在diff_token資料幀中出現的次數。為此,我們建立一個名為py_lib的字典,并統計庫的出現次數。

py_lib={}j=0for j in range(0,len(diff_token)):word = diff_token['index'](j).lower()if word in py_lib:py_lib[word]+=diff_token['token'](j)else:py_lib[word]=1j+=為了将上述步驟應用于我們在前面收集的整個示例資料中,我在步驟的開頭添加了一個循環。下面是代碼:

i=0error=0py_lib={}for row in tf_source.iterrows():#parsing the source file before applying commit iif tf_source['Commit_before'](i) is not None:try:text_before=str(tf_source['Commit_before'](i))bf_obj = FuncParser()bf_tree = ast.parse(text_before)file_contents = []bf_obj.visit(bf_tree)dtobj_before = pd.DataFrame(file_contents, columns=['token'])tokens_before =pd.DataFrame(dtobj_before['token'].value_counts())except:error +=1else:file_contents = []dtobj_before = pd.DataFrame(file_contents, columns=['token'])tokens_before =pd.DataFrame(dtobj_before['token'].value_counts())#parsing the source file after applying commit iif tf_source['Commit_after'](i) is not None:try:text_after=str(tf_source['Commit_after'](i))aft_obj = FuncParser()aft_tree = ast.parse(text_after)file_contents = []aft_obj.visit(aft_tree)dtobj_after = pd.DataFrame(file_contents, columns=['token'])tokens_after =pd.DataFrame(dtobj_after['token'].value_counts())except:error +=1else:file_contents = []dtobj_after = pd.DataFrame(file_contents, columns=['token'])tokens_after =pd.DataFrame(dtobj_after['token'].value_counts())#calculating the differences between two list tokens_before and tokens_afterdiff = tokens_after.subtract(tokens_before)diff_token = diff[(diff.select_dtypes(include=['number']) != 0).any(1)]diff_token=diff_token.fillna(0)diff_token= diff_token.abs()diff_token = diff_token.reset_index()# counting the numer of each libraries which are added or removed by commit ij=0for j in range(0,len(diff_token)):word = diff_token['index'](j).lower()if word in py_lib:py_lib[word]+=diff_token['token'](j)else:py_lib[word]=1j+=1i+=1在整個示例資料集中收集庫。

現在我們收集了 GitHub 中所有 Python 倉庫的庫及其送出頻率,我們想在py_lib字典中找到前 10 個庫。我們可以用下面的代碼将前 10 個庫的值收集到一個字典中。

我們可以看到,從示例資料集來看,warnings、sys或datetime等庫都在 Python 标準庫的前 10 名清單中。

from operator import itemgetterd=sorted(py_lib.items(), key=itemgetter(1),reverse=True)[:10][('warnings', 96.0),('sys', 73.0),('datetime', 28.0),('test', 27.0),('os', 22.0),('collections', 18.0),('io', 16.0),('gc', 10.0),('functools', 9.0),('threading', 7.0)]

python中的标準庫有哪些餐廳_Python 中最流行的十個标準庫

基于 GitHub 示例資料集的 Python 十大标準庫。

另外,我們還可以繪制 Python 庫的詞雲圖及其頻率。

import matplotlib.pyplot as pltfrom wordcloud import WordCloudwordcloud = WordCloud(background_color='black',max_font_size = 50)wordcloud.generate_from_frequencies(frequencies=py_lib)plt.figure(figsize=(8,6))plt.imshow(wordcloud, interpolation="bilinear")plt.axis("off")plt.show()

python中的标準庫有哪些餐廳_Python 中最流行的十個标準庫

基于 GitHub 示例資料集的流行 Python 庫的詞雲圖。

總結

在本文中,我們嘗試基于一個示例資料集收集 10 個最受歡迎的 Python 庫。這個資料集包含了 GitHub 中 5 個著名的 Python 倉庫最近一年的送出情況。

我們使用 Pydriller 來收集 GitHub 的資料。我們對送出之前和送出之後的源檔案抽象文法樹進行了比較,并收集了這些送出中使用的庫清單。最後,我們在詞雲圖中繪制了最流行的 Python 庫。

注:要複制本文的所有代碼,可以在GitHub上找到。

作者介紹:

Arghavan Moradi,博士研究所學生,熱愛學習,喜歡分享。

原文連結:

https://towardsdatascience.com/what-are-the-10-most-popular-standard-libraries-in-python-359defb104d6

延伸閱讀:

一文了解大資料管理的技術-InfoQ

關注我并轉發此篇文章,私信我“領取資料”,即可免費獲得InfoQ價值4999元迷你書,點選文末「了解更多」,即可移步InfoQ官網,擷取最新資訊~