首页 > 数据库 > 数据库开发技术 > 5个被过度高估的Python库(你绝对想不到)!
——路漫漫其修远兮,吾将上下而求索。
前路漫漫,我用 Python 探世界。Hello,大家好,我是爱学习的小张,你可以叫我 Jack Zhang。
时间过得真快,又到冬天了,北方的冬天是真冷,冻得瑟瑟发抖。你那里天气怎么呢?
今天我将给大家分享5个日常工作中高频使用的 Python 库,但是你绝对想不到我们大多数人都高估它们了,它们有更优的替代者。
注意:这并不意味着这些库没有价值——恰恰相反!但是对于特定任务,有更轻量级、更快速的选项也可以达到相同的目标,有时性能甚至更好。
听着,使用Requests 本身并没有什么问题。它很直观,有一个非常棒的 API,实际上,它可以称得上是 Python HTTP 库的吉祥物。But,当你只需要发出简单的GET/POST 请求时,就有点过度捧杀它了,并且在需要异步性能的环境中它会显得有些滞后。
阻塞 I/O:Requests 是同步的,这意味着每个调用都必须等待上一个调用完成。在处理 I/O 密集型任务时,它的效果就不太理想。
笨重:这个库提供了很多便利,但在速度和内存占用方面确实有成本。对于简单的脚本来说没什么大不了的,但如果在大型系统中,这可能会消耗更多的资源,给系统带来瓶颈。
httpx
对于并行请求处理,httpx 提供了类似的 API,并且该库提供了异步支持。因此,如果需要进行多次 API 调用,它可以为你节省一定时间和资源,因为它可以并发处理那些请求。
场景案例:假设我们需要从几个个公共 API 接口中获取数据,比如天气、新闻和货币汇率,然后整合这些数据,方便进一步分析。
import httpx
import asyncio
import json
# 定义目标 API 的 URL
API_ENDPOINTS: dict = {
"weather": "https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London",
"news": "https://newsapi.org/v2/top-headlines?country=us&apiKey=YOUR_NEWS_API_KEY",
"exchange_rate": "https://open.er-api.com/v6/latest/USD"
}
async def fetch_data(client: httpx.AsyncClient, name: str, url: str) -> dict:
try:
response = await client.get(url, timeout=10)
response.raise_for_status()
return {name: response.json()}
except httpx.HTTPStatusError as e:
print(f"HTTP error while fetching {name}: {e}")
return {name: {"error": str(e)}}
except Exception as e:
print(f"Error while fetching {name}: {e}")
return {name: {"error": str(e)}}
# 异步获取所有 API 数据
async def fetch_all_data():
async with httpx.AsyncClient() as client:
tasks = [
fetch_data(client, name, url)
for name, url in API_ENDPOINTS.items()
]
results = await asyncio.gather(*tasks)
return {key: value for result in results for key, value in result.items()}
# 主程序入口
async def main():
data = await fetch_all_data()
# 保存数据到 JSON 文件
with open("api_data.json", "w") as f:
json.dump(data, f, indent=4)
print("Data successfully fetched and saved to api_data.json!")
if __name__ == "__main__":
asyncio.run(main())
PS:由于在天气和新闻的 URL 中我们没有提供具体的
API_KEY,所以获取失败。[引用]
看到这里,我知道这是有争议的,估计很多人持否定态度。BeautifulSoup 多年来一直是处理 HTML 解析的标准库,但它的性能并不像以前那么好了。大型或复杂的文档往往会使BeautifulSoup 感觉迟钝,而且它还没有进化到跟上 Python 的异步优先环境。
速度:当文档非常大时,其解析速度不是很快。
线程阻塞:与Requests 库很像,BeautifulSoup 在设计时并没有考虑到异步,这无疑使它不适合抓取动态网站。
selectolax
selectolax 是一个不太出名的库,它使用libxml2 获得更好的性能以及更少的内存消耗。
场景案例:假设我们需要从一个新闻网站的主页中提取新闻标题、链接和发布时间,并保存到本地 CSV 文件中。这个任务通常是爬虫数据采集的其中一个子任务。
from typing import List, Dict
from selectolax.parser import HTMLParser, Node
import httpx
import csv
# 定义目标 URL (可以替换任何支持的网站)
TARGET_URL: str = "https://news.ycombinator.com/"
def fetch_html(url: str) -> str:
"""
发送 HTTP 请求获取 HTML 内容
"""
response: httpx.Response = httpx.get(url, timeout=10)
response.raise_for_status() # 确保请求成功
return response.text
def parse_html(html: str) -> List[Dict[str, str]]:
"""
使用 selectolax 解析 HTML 内容
"""
parser: HTMLParser = HTMLParser(html)
# 存储新闻数据
news_data: List[Dict[str, str]] = []
# 查找所有新闻标题的节点
for title_cell in parser.css("td.title"):
span_nodes: List[Node] = title_cell.css("span.titleline")
if span_nodes:
span_node: Node = span_nodes[0]
link_node: Node = span_node.css_first("a")
if link_node:
title: str = link_node.text(strip=True)
link: str = link_node.attributes.get("href", "")
news_data.append({"title": title, "link": link})
# 查找发布时间信息(位于下一个表格行)
for idx, subtext in enumerate(parser.css(".subtext")):
time_node: Node = subtext.css_first(".age")
if time_node is not None:
news_data[idx]["time"] = time_node.text(strip=True)
return news_data
# 保存数据到 CSV 文件
def save_to_csv(news_data: list, filename: str) -> None:
with open(filename, mode="w", newline="", encoding="utf-8") as f:
writer: csv.DictWriter = csv.DictWriter(f, fieldnames=["title", "link", "time"])
writer.writeheader()
writer.writerows(news_data)
print(f"Data successfully saved to {filename}")
def main(filename: str) -> None:
try:
print("Fetching HTML...")
html = fetch_html(TARGET_URL)
print("Parsing HTML...")
news_data = parse_html(html)
print("Saving data to CSV...")
save_to_csv(news_data, filename)
print("Done!")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
main("data_filles/news_data.csv")
事实证明,使用selectolax 库,你可以保留与BeautifulSoup 想通的 HTML 解析功能,但速度会大大提高,使其成为数据密集型网络抓取任务的理想选择。
PS:工具不是唯一的,结果才是。选择合适的工具是成功的一半。
如果你觉得光看理论太枯燥,渴望通过动手实践、基于项目案例来学习 Python 的话,那么我向你推荐 Eric Matthes 的“Python 编程从入门到实践”,迄今为止,热销超过250 万册,豆瓣评分9.2,最新的第 3 版基于 Python 3.11 全新升级,无论你是新手还是老司机,这本书都是学习 Python 的不二选择。
Pandas 作为数据分析三剑客之一,相信每个使用过它的人都不陌生,我工作中几乎每天都会用到它。这个库非常擅长数据探索和中型规模的数据集。人们对它好像过度高估了,潜意识里总是认为它好像能解决所有数据问题。但是,坦率地说,事实并非如此。当使用Pandas 来处理大型数据集时,可能会让你的机器性能由飞鸟变成蜗牛,因为它的内存开销特别大。
内存开销大:由于Pandas 主要运行在内存中,因此对大型数据集执行任何操作都会影响性能。
可扩展性有限:要扩展Pandas 并不容易,因为它从来都不是为大数据而设计的。
Polars 是使用 Rust 语言(用到了 Apache Arrow)编写的一个超快的 DataFrame 库。专门针对内存效率和多线程性能进行了优化,使其非常适合用于在不过度占用 CPU 的情况下处理大型数据集。
import polars as pl
df = pl.read_csv('large_dataset.csv')
filtered_df = df.filter((pl.col('age') > 30)
& (pl.col('salary') > 50000))
print(filtered_df)
为什么选择 Polars?它可以处理会让 Pandas 望而却步的数据,并且在极短的时间内完成操作。除此之外,它还具有惰性计算的特性——这意味着它执行的是按需计算。
是的,Matplotlib 是经典的——在 Python 中可视化数据时几乎是标准选择。但坦白说,这感觉就像用斧头进行精细的脑外科手术,而它的语法?说老实话,有点冗长。如果你不需要创建高度自定义的可视化,实际上有更好的选择,语法也更简单。
笨重的语法:即使是简单的图表,有时也需要惊人数量的代码行来绘制。
过时的默认样式:默认样式是可配置的,但并不特别令人振奋——或者说,特别易读。
在可视化的整洁性和交互性很重要的情况下,绝对不想要一堆代码,Plotly 是一个很好的选择。这在你需要快速分享视觉效果或在网络演示中使用时尤其有用。
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
fig.show()
使用Ploty,你可以即时获得具有出色默认视觉效果的交互式图表。代码更简洁,并且默认包含工具提示和缩放等功能。
事实上,Scikit-Learn 并不是一个深度学习库,但人们却像使用深度学习库一样使用它。虽然它在快速原型设计和传统机器学习模型方面非常方便,但在神经网络方面,它与专为张量设计的库根本不在同一个水平上。
没有 GPU 支持:在 GPU 上进行训练时,深度学习可以改变生命周期。然而,这在Scikit-Learn 中是不支持的。
对神经网络没有进行优化:Scikit-Learn 并不是为深度学习而设计的,所以通过这种方式使用它得到的结果并不怎么样。
PyTorch 更加通用并支持 GPU。因此,它非常适合深度学习项目。它是Pythonic 的——这意味着对于使用过Scikit-Learn 的人来说,会感觉很自然,但功能却更强大。
import torch
import torch.nn as nn
import torch.optim as optim
# Define a simple model
model = nn.Sequential(
nn.Linear(10, 5),
nn.ReLU(),
nn.Linear(5, 2)
)
# Define optimizer and loss
optimizer = optim.SGD(model.parameters(), lr=0.01)
loss_fn = nn.CrossEntropyLoss()
如果你对深度学习很认真,你会想使用一个为手头任务而设计的库——这将使你免于这些限制和低效。你将使用PyTorch 微调模型,并尽情利用 GPU。
总之,我们要选择正确的工具,正确的完成任务。
文章有点长,希望对你有所帮助,感谢你的阅读!
推荐阅读👇👇👇
不掌握这10个Python概念,请不要自称高级开发人员(二)~~
不掌握这10个Python概念,请不要自称高级开发人员(一)~~
Python必知必会:39个Python关键字详解,你的编程查阅小手册,收藏!
Python必知必会:每个程序员都必须知道的22个Python单行代码!
Python必知必会:15个令人相见恨晚的Python字符串格式化技巧!
- END -
🌟 如果你喜欢这篇文章并且愿意支持我的话,你可以: 🌟
👍👍👍 点赞文章 ⤴️⤴️⤴️ 转发文章 ⚛️⚛️⚛️ 点击在看 🧑🤝🧑🧑🤝🧑🧑🤝🧑 让文章被推荐给更多人,找到更多志同道合的伙伴 👏👏👏 欢迎给我留言 关注我,第一时间接收更多关于Python、数据分析和机器学习的深入分析和最新趋势。我们一起探索数据的力量,解锁AI的潜能。你的每一次互动都是对我的极大鼓励,也是我们共同成长的动力!
👇👇👇 关注并开启星标提醒,让知识与技能的火花不断在你的职业道路上燃烧吧!
原文作者:数据派探险家;如有侵权,请联系管理员删除。