您可以从 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:
$ pypinfo --limit 10 --days 1 "" project Served from cache: False Data processed: 58.21 GiB Data billed: 58.21 GiB Estimated cost: <pre class="brush:php;toolbar:false">$ pypinfo --all --limit 10 --days 1 "" project Served from cache: False Data processed: 46.63 GiB Data billed: 46.63 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) AND details.installer.name = "pip" GROUP BY project ORDER BY download_count DESC LIMIT 10
结果:
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 个软件包的一天下载数据,所有安装程序:
$ pypinfo --limit 10 --days 1 "" project Served from cache: False Data processed: 58.21 GiB Data billed: 58.21 GiB Estimated cost: <pre class="brush:php;toolbar:false">$ pypinfo --all --limit 10 --days 1 "" project Served from cache: False Data processed: 46.63 GiB Data billed: 46.63 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) AND details.installer.name = "pip" GROUP BY project ORDER BY download_count DESC LIMIT 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:
SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) GROUP BY project ORDER BY download_count DESC LIMIT 10
对于所有安装者:
$ pypinfo --all --limit 100 --days 1 "" installer Served from cache: False Data processed: 29.49 GiB Data billed: 29.49 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) GROUP BY project ORDER BY download_count DESC LIMIT 8000
这些查询是相同的,只是默认有一个额外的 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。示例查询:
$ pypinfo --limit 10 --days 1 "" project Served from cache: False Data processed: 58.21 GiB Data billed: 58.21 GiB Estimated cost: <pre class="brush:php;toolbar:false">$ pypinfo --all --limit 10 --days 1 "" project Served from cache: False Data processed: 46.63 GiB Data billed: 46.63 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) AND details.installer.name = "pip" GROUP BY project ORDER BY download_count DESC LIMIT 10
结果:有趣的是,所有限额(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中文网其他相关文章!