您可以從 Google BigQuery 資料集中取得 PyPI 套件(或項目)的下載數量。您需要一個 Google 帳戶和憑證,Google 每月提供 1 TiB 的免費配額。
每個月,我都會自動獲取過去 30 天內 8,000 個最受歡迎的軟體包的下載數量,並將其作為更易於訪問的 JSON 和 CSV 文件在 Top PyPI Packages 中提供。這些數據被廣泛用於學術界和工業界的研究。
但是,隨著越來越多的軟體包和版本上傳到 PyPI,並且記錄的下載量越來越多,計費資料量也會增加。
此圖表顯示每月計費的資料量。
一開始,我只收集了 4,000 個軟體包的下載數據,並透過兩個查詢取得:超過 365 天和超過 30 天的下載。但隨著時間的推移,它開始用完太多的配額來下載 365 天的數據。
所以我放棄了 365 天的數據,並將 30 天的數據從 4,000 個包裹增加到 5,000 個。後來我查了一下配額用了多少,從5000包增加到8000包。
但後來我超出了 BigQuery 2024 年 7 月獲取數據的每月 1 TiB 配額。
為了獲取遺失的資料並調查發生了什麼,我開始了 Google Cloud 的 90 天、300 美元(277.46 歐元)免費試用?
這是我發現的!
我使用 pypinfo 用戶端來幫助查詢 BigQuery。預設情況下,它僅取得 pip 的下載。
此指令取得前 10 個軟體套件的一天下載數據,僅適用於 pip:
結果:
project | download count |
---|---|
boto3 | 37,251,744 |
aiobotocore | 16,252,824 |
urllib3 | 16,243,278 |
botocore | 15,687,125 |
requests | 13,271,314 |
s3fs | 12,865,055 |
s3transfer | 12,014,278 |
fsspec | 11,982,305 |
charset-normalizer | 11,684,740 |
certifi | 11,639,584 |
Total | 158,892,247 |
新增 --all 標誌可取得前 10 個軟體套件的一天下載數據,所有安裝程式:
project | download count |
---|---|
boto3 | 39,495,624 |
botocore | 17,281,187 |
urllib3 | 17,225,121 |
aiobotocore | 16,430,826 |
requests | 14,287,965 |
s3fs | 12,958,516 |
charset-normalizer | 12,781,405 |
certifi | 12,647,098 |
setuptools | 12,608,120 |
idna | 12,510,335 |
Total | 168,226,197 |
因此我們可以看到,預設的僅 pip 需要額外花費 25% 的資料處理和資料計費,並額外花費 25% 的美元費用。
毫不奇怪,所有安裝程式的實際下載次數都更高。排名發生了一些變化,但我預計我們在前數千個結果中仍然會得到或多或少相同的軟體包。
它向 BigQuery 發送這樣的查詢,只取得 pip:
對所有安裝者:
這些查詢是相同的,只是預設有一個額外的 ANDdetails.installer.name = "pip" 條件。做額外的過濾工作會花費更多,這似乎是合理的。
讓我們看看安裝程式:
installer name | download count |
---|---|
pip | 1,121,198,711 |
uv | 117,194,833 |
requests | 29,828,272 |
poetry | 23,009,454 |
None | 8,916,745 |
bandersnatch | 6,171,555 |
setuptools | 1,362,797 |
Bazel | 1,280,271 |
Browser | 1,096,328 |
Nexus | 593,230 |
Homebrew | 510,247 |
Artifactory | 69,063 |
pdm | 62,904 |
OS | 13,108 |
devpi | 9,530 |
conda | 2,272 |
pex | 194 |
Total | 1,311,319,514 |
pip 仍然是迄今為止最受歡迎的,不出所料,uv 也位居榜首,約佔 pip 下載量的 10%。
其他的大約是紫外線的25%或更少。其中很多是我們之前想要排除的鏡像服務。
我認為,考慮到 uv 的重要性,以及我期望它將繼續佔據更大份額,再加上僅透過 pip 進行過濾的額外成本,意味著我們應該轉而為所有下載者獲取資料。另外,其他的並沒有佔那麼多份額。
這是最大的驚喜。早些時候,我一直在增加或減少數量,以盡量保持在配額以內。但事實證明,查詢多少包裹並沒有什麼差別!
我只取得了一天的資料以及不同軟體包限制的所有安裝程式:1000、2000、3000、4000、5000、6000、7000、8000。範例查詢:
結果:有趣的是,所有限額(1000-8000)的成本都是相同的:0.31 美元。
重複一天,但僅過濾點:
結果: 成本增加至 0.39 美元,但所有限制均相同。
讓我們對所有安裝程式重複一遍,但持續30 天,這次查詢的限制是遞減的,以防我們只為增量更改付費:8000、7000、6000、5000、4000、3000、2000、 1000:
結果:同樣,無論套餐限制如何,費用都是相同的:每次查詢 4.89 美元。
那麼,讓我們重複一遍,將限制增加十次方,直到 1,000,000!最後一個取得 PyPI 上所有 531,022 個套件的資料:
limit | projects count | estimated cost | bytes billed | bytes processed |
---|---|---|---|---|
1 | 1 | 0.20 | 43,447,746,560 | 43,447,720,943 |
10 | 10 | 0.20 | 43,447,746,560 | 43,447,720,943 |
100 | 100 | 0.20 | 43,447,746,560 | 43,447,720,943 |
1000 | 1,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
8000 | 8,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
10000 | 10,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
100000 | 100,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
1000000 | 531,022 | 0.20 | 43,447,746,560 | 43,447,720,943 |
結果:同樣,無論是 1 包還是 531,022 包,成本都是一樣的!
不足為奇。我之前就注意到 365 天佔了太多配額,我可以繼續 30 天。
以下是1 到30 天內的估計成本和位元組數(針對一個軟體包、所有安裝程式)(f"pypinfo --all --json --indent 0 --days {days} --limit 1 '' 項目」),呈現大致線性的成長:
無論我獲取多少個包的數據,我都可以獲得所有包並將其提供給每個人,具體取決於數據文件的大小。仍然提供包含 8,000 個左右包的較小文件是有意義的:通常您只需要一個較大但易於管理的數字。
僅過濾來自 pip 的下載會花費更多,因此我已轉為獲取所有安裝程式的資料。
天數會影響成本,因此我將來需要減少天數以保持在配額之內。例如,在某些時候我可能需要從 30 天切換到 25 天,然後從 25 天切換到 20 天。
更多調查細節、腳本和資料檔案可以在
找到
hugovk/top-pypi-packages#36.
如果您知道任何降低成本的技巧,請告訴我!
標題照片:“平衡石,巨石陣,新南威爾士州格倫因尼斯附近”,由澳大利亞皇家歷史學會拍攝,沒有已知的版權限制。
以上是PyPI 的 BigQuery 數據令人驚訝的事情的詳細內容。更多資訊請關注PHP中文網其他相關文章!