分享 6 个实用的轮子

阅读本文大概需要 5 分钟。

新的一年,祝大家身体健康,百毒不侵。最好远离人群,做一个死宅。

最近看到几个非常实用的 Python 库,它们太优秀了,让我忍不住分享,我相信在今后的编程之路上,你有很大的概率会使用它们,请先看一下,在大脑中先留下印象,方便以后拿来使用。

1、快速的异步 web 框架 FastApi

FastApi 是一个异步 Web 框架,它的速度非常非常非常快。远远超过 Flask,速度匹敌与 go 语言写的接口。这不是乱说的,请看下图中的测试结果,FastApi 性能排在第一:

web框架性能对比

图片来源: https://www.techempower.com/benchmarks/#p=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7

使用它最主要的原因是写以写很少的代码实现一个 web 接口,不仅速度快,还自带参数检查功能,非常简洁优雅。

安装:

pip install fastapi

你还可能需要 ASGI 服务器用于生产环境,比如 Uvicorn 或 Hypercorn,那么安装一下:

pip install uvicorn

一个简单的示例:

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

你还可以使用 async / await

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

启动服务器:

uvicorn main:app --reload

浏览器打开 http://127.0.0.1:8000/items/5?q=somequery. 就可以看到 JSON 格式的响应数据。

{"item_id": 5, "q": "somequery"}

交互式的接口文档:

已经为你生成好交互式的接口文档:

1、浏览器打开 http://127.0.0.1:8000/docs 就可以看到 Swagger UI 的 api 文档。

2、浏览器打开 http://127.0.0.1:8000/redoc 就可以看到 ReDoc 生成的 api 文档。

便捷的参数类型检查:

通过一个简单的类,就可以做参数检查。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

当传入错误的参数时,接口会自动返回具体的参数错误信息,完全不用再动手写代码检查。常便捷。

官方链接(star 8.5k):https://github.com/tiangolo/fastapi

其他 Python 的 web 框架:

1、Django
2、Django rest framework
3、Flask
4、Tornado
5、Bottle
6、Quixote

2、提升代码速度的装饰器 lru_cache

看名字就知道是 LRU 相关,也与缓存相关。有时候代码执行的非常慢,像有些递归调用,加上这个装饰器,可以快 100 倍。比如递归写法来计算 Fibonacci 的代码如下:

def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)

n 的值比较大的时候,计算的特别慢,n = 35 的时候,可能需要 4 秒。但使用 lru_cache 后:

from functools import lru_cache

@lru_cache()
def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)

耗时接近 35 毫 秒(你可以使用 timeit 来试一下),速度提升百倍,这个 lru_cache 到底做了什么?

lru_cache 装饰器记录了最近使用的函数调用, 因此,它存储已经计算出的值,并在需要时重用它们。为了防止 LRU 缓存无限增长,建议在lru_cache装饰器中指定maxsize。如果指定,它将仅存储最近调用的最大大小。

为了检查 LRU 缓存的效果,我们可以调用执行函数的缓存信息函数
来查看,代码如下:

import sys
from functools import lru_cache


@lru_cache(maxsize=64)
def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)


print([fibonacci(x) for x in range(35)])
# 查看缓存信息
print(fibonacci.cache_info())

运行结果如下:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4
181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 83
2040, 1346269, 2178309, 3524578, 5702887]
CacheInfo(hits=66, misses=35, maxsize=64, currsize=35)

3、进度条工具 tqdm

如果你需要用来显示程序运行的进度,希望显示得漂亮一些的话,那么 tqdm 不可错过,它是一个灵活、可扩展、几乎不影响原程序效率的 Python 进度条。

使用前先安装:

pip install tqdm

效果展示

官网: https://github.com/tqdm/tqdm

4、一键生成数据分析报告:pandas-profiling

经常做数据分析的人肯定知道 pandas 库,面对一些数据集,要做一些探索性分析,过程繁锁而冗杂,比如一个数据分析常用的示例泰坦尼克号:

import pandas as pd

data = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')
data.describe()

执行以下代码后会生成一个表格:

data.describe

然后自己通过分类,关联等方法,生成各种柱状图,拆线图,然后进一步分析,这个探索的过程非常耗时,现在有了 pandas-profiling,只需要二行代码,就可以得到分析结果,实在是太方便了。

import pandas_profiling  
data.profile_report(title='Titanic Dataset')

此处省略大量截图,请自行尝试。

还可以一键存储为 html 页面:

profile = data.profile_report(title='Titanic Dataset')
profile.to_file(output_file='result/titanic_report.html')

5、Python 的 wget

有时递归下载一个网站或者下载一个网站的所有图片,并不需要自己动手写爬虫,也许 wget 就够用了。这个工具非常的简单易用:

>>> import wget
>>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'
>>> filename = wget.download(url)
100% [................................................] 3841532 / 3841532>
>> filename
'razorback.mp3'

官网:https://bitbucket.org/techtonik/python-wget/src

6、在 Python 中执行 shell 命令

也许你非常熟悉 shell 命令,正在学习 Python,如何在 Python 中执行 shell 命令呢,相信这个 sh 库会非常有用。

安装方法:

pip install sh

使用方法:

from sh import ifconfig
print(ifconfig("wlan0"))

输出结果:

wlan0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00
        inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
        inet6 addr: ffff::ffff:ffff:ffff:fff/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:0 errors:0 dropped:0 overruns:0 frame:0
        TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:0 (0 GB)  TX bytes:0 (0 GB)

官网:https://amoffat.github.io/sh/

(完)

发布了45 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/somenzz/article/details/104549190