小编Ada*_*mer的帖子

Rust 的 HashMap 中“插入或更新”操作的最佳实践是什么?

我正在寻找最佳实践insert-or-update operation, because it is very commonly used, I think we need to optimize both its writing style and efficiency.

假设以下场景:我有一个hashmap

let classes: HashMap(String, HashSet<String>) = HashMap::new()
Run Code Online (Sandbox Code Playgroud)

用于存储学生和谁的班级。

数据预计采用以下形式:

{ key: "ClassA", value: {"Bob", "Marry", "Jack"}},
{ key: "ClassB", value: {"Lee", "Tom"}},
Run Code Online (Sandbox Code Playgroud)

现在我得到了一个学生和他/她的班级的一组新数据,我们来看:

{ name: "Alice", class: "ClassC"}
Run Code Online (Sandbox Code Playgroud)

由于我不确定该类是否已经出现在 HashMap 中classes,因此我需要先弄清楚它是否存在,如果存在,我将更新该值,如果不存在,我将添加一个新的key->value pair.

没有任何不必要的移动或复制的正确方法是什么?根据其他答案,我尝试使用std::collections::hash_map::Entry but I failed.

谢谢!

hashmap rust

9
推荐指数
1
解决办法
5950
查看次数

可学习位置嵌入的本质是什么?嵌入可以更好地改善结果吗?

我最近正在阅读huggingface项目的bert源代码。我注意到所谓的“可学习位置编码”在实现时似乎指的是特定的 nn.Parameter 层。

\n
def __init__(self):\n    super()\n    positional_encoding = nn.Parameter()\ndef forward(self, x):\n    x += positional_encoding\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x86\x91 可能是这种感觉,然后进行了可学习的位置编码。不管是不是这么简单,我不确定我理解是否正确,我想请教有经验的人。

\n

此外,我注意到一个经典的 bert 结构,其位置实际上仅在初始输入时编码一次。这是否意味着后续的bert层,对于彼此来说,失去了捕获位置信息的能力?

\n
BertModel(\n  (embeddings): BertEmbeddings(\n    (word_embeddings): Embedding(30522, 768, padding_idx=0)\n    (position_embeddings): Embedding(512, 768)\n    (token_type_embeddings): Embedding(2, 768)\n    (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n    (dropout): Dropout(p=0.1, inplace=False)\n  )\n  (encoder): BertEncoder(\n    (layer): ModuleList(\n      (0): BertLayer(...)\n      ...\n  (pooler): BertPooler(...)\n
Run Code Online (Sandbox Code Playgroud)\n

如果在下一个 BERT 层之前对上一层的结果进行重新位置编码,我会得到更好的结果吗?

\n

transformer-model deep-learning pytorch bert-language-model

7
推荐指数
1
解决办法
5141
查看次数

如何在python36中获取当前正在运行的EventLoop?

我知道在python37中我们有一个新的api asyncio.get_running_loop(),它很容易使用,让我们在调用协程时不需要显式地传递eventloop。

我想知道我们是否可以使用任何方法在 python36 中获得相同的效果?

# which allows us coding conveniently with this api:
import asyncio

async def test():
    print("hello world !")

async def main():
    loop = asyncio.get_running_loop()
    loop.create_task(test())

asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)

python-asyncio python-3.6

5
推荐指数
1
解决办法
4007
查看次数

如何向FastAPI中间件传递参数并影响其处理逻辑?

我们知道,通过request.state我们可以将一些自定义数据从中间件的处理前过程传递给处理程序,从而影响其行为,我目前想知道处理程序如何影响中间件之后的逻辑。

我的具体业务场景是,我有一个路由地址(举/api个例子),它的作用是计算一个动态结果,会消耗比较长的时间,返回比较大的json响应。从操作上来说,提高效率的一个有效方法是使用一些缓冲区(如redis)来缓存其结果,这样每次缓存命中时都可以节省计算时间。

由于我的内存有限,我想将 gzip 压缩的字节存储在缓冲区中而不是原始 json 流中,这将大大增加我可以处理的缓存量。numbers具体来说,由于响应内容较多,未经gzip处理的响应内容通常在20MB左右,而压缩后只有1MB左右。这意味着,使用 1GB 内存,在不压缩的情况下我只能缓存 50 个不同的响应,而在压缩的情况下我可以缓存 1000 个,这是一个难以忽视的显着差异。

由于这些需求,我想实现一个功能齐全的 gzip 中间件,但存在几个技术困惑。第一个是我想控制中间件是否压缩,显然,如果响应没有命中缓存而是动态生成的,那么它应该被压缩,但相反,它不应该再次压缩,因为它已经已经被压缩过一次了。第二个问题是,即使我可以控制中间件不压缩,当不需要运行压缩逻辑时,如何将其结果替换为已经压缩的字节?

由于我还不知道如何实现,请原谅我只能提供一些伪代码来说明我的想法。

下面的代码描述了一个相对复杂的不包含中间件的响应地址:

from fastapi import FastAPI, Request
import uvicorn

app = FastAPI()

@app.post("/api")
async def root(request :Request, some_args: int):

    # Using the Fibonacci series to simulate a time-consuming 
    # computational operation
    def fib_recur(n):
    if n <= 1: return n
    return fib_recur(n-1) + fib_recur(n-2)
    
    # In addition to the time-consuming calculation, the size of 
    # the returned content is …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio starlette fastapi

5
推荐指数
0
解决办法
2652
查看次数

如何在 python 3.8 的异步编程中使用“yield”语句?

在python的asyncio异步编程(3.7或以下版本)中,如果我想手动让协程将其控制权交还给主事件循环,我可以使用以下代码:

@asyncio.coroutine
def switch():
    yield
    return

async def task():
    # ...do something
    # ...
    await switch() # then this coroutine will be suspended and other will be triggered
    # ...
    # ... do something else when it's triggered again.
Run Code Online (Sandbox Code Playgroud)

然而,在 python3.8 中,“@coroutine”装饰器已被弃用。除此之外,我无法在“async def”中使用yield(因为它将定义异步生成器而不是协程)。那么我怎样才能实现同样的功能呢?

python python-asyncio

4
推荐指数
1
解决办法
2026
查看次数

有什么方法可以将 FastAPI 处理程序的输入参数限制为几个指定的选项吗?

我想知道是否有某种方法可以让我轻松处理输入参数并将它们限制为 FASTAPI 中的多个值。

例如,如果我在这里有一个 hello-world 处理程序:

from fastapi import FastAPI

app = FastAPI()

@app.get(/)
async def root(name:str):
    return {"user_name_is": name}
Run Code Online (Sandbox Code Playgroud)

而我想要实现的是,让用户只能输入以下名称之一作为参数 [ Bob, Jack] ,其他名称都是非法的。

编写一些进一步的检查代码即可达到预期结果并不复杂:

from fastapi import FastAPI

app = FastAPI()

@app.get(/)
async def root(name:str):
    if name in ['Bob' , 'Jack']:
         return {"user_name_is": name}
    else:
         raise HTTPException(status_code=403)
Run Code Online (Sandbox Code Playgroud)

然而,编写代码仍然不够容易,尤其是当需要处理大量输入参数时。我想知道是否有一种方法可以使用类型提示和 pydantic 来达到相同的结果?

在文档中没有找到太多信息,需要帮助,谢谢。

=======

顺便说一句,如果我也有机会需要获取输入参数列表,有什么方法可以检查它们,就像下面的代码一样?

from fastapi import FastAPI
from typing import List

app = FastAPI()

@app.get(/)
async def root(names:List[str]):
    for name in names:
        if name not in …
Run Code Online (Sandbox Code Playgroud)

python-asyncio fastapi

3
推荐指数
1
解决办法
2498
查看次数