(使用的是Python3.9,但可以升级到更新版本)

我有两个数字-CPU(VCPU)和RAM(GB)-应用程序的资源需求.

从实例大小列表中,我试图找到我的应用程序可以在其上运行的最接近的匹配项--只要该实例有足够的CPU和RAM.

以下是我要比较的特定实例列表:

instance_sizes = [
    {"name": "t3a.nano", "cpu": 2, "mem": 0.5},
    {"name": "t3a.micro", "cpu": 2, "mem": 1},
    {"name": "t3a.small", "cpu": 2, "mem": 2},
    {"name": "t3a.medium/c5a.large", "cpu": 2, "mem": 4},
    {"name": "t3a/m5a.large", "cpu": 2, "mem": 8},
    {"name": "c5a.xlarge", "cpu": 4, "mem": 8},
    {"name": "t3a/m5a.xlarge", "cpu": 4, "mem": 16},
    {"name": "c5a.2xlarge", "cpu": 8, "mem": 16},
    {"name": "t3a/m5a.2xlarge", "cpu": 8, "mem": 32},
]
  • cpu 1.8,mem 6应返回t3a/m5a.large
    • (这台机器有2个vCPU和8 GB内存.只有4 GB的t3a.small没有足够的内存)
  • cpu 0.1,mem 6应返回t3a/m5a.large
    • (这台机器有2个vCPU和8 GB内存.只有4 GB的t3a.small没有足够的内存.它仍然过大,例如0.1个CPU是2个,但它是能够运行应用程序的最小实例)
  • cpu 2.1,mem 6应返回c5a.xlarge
  • cpu 6,mem 16应返回c5a.2xlarge

提前谢谢你

推荐答案

这里有一个 Select ,用一个测试来证明它通过了您的所有示例:

import pytest

instance_sizes = [
    {"name": "t3a.nano", "cpu": 2, "mem": 0.5},
    {"name": "t3a.micro", "cpu": 2, "mem": 1},
    {"name": "t3a.small", "cpu": 2, "mem": 2},
    {"name": "t3a.medium/c5a.large", "cpu": 2, "mem": 4},
    {"name": "t3a/m5a.large", "cpu": 2, "mem": 8},
    {"name": "c5a.xlarge", "cpu": 4, "mem": 8},
    {"name": "t3a/m5a.xlarge", "cpu": 4, "mem": 16},
    {"name": "c5a.2xlarge", "cpu": 8, "mem": 16},
    {"name": "t3a/m5a.2xlarge", "cpu": 8, "mem": 32},
]


def get_instance_size(cpu, mem):
    return next(
        x
        for x in sorted(instance_sizes, key=lambda size: size["cpu"])
        if x["cpu"] >= cpu and x["mem"] >= mem
    )


@pytest.mark.parametrize(
    "cpu,mem,expected",
    (
        (1.8, 6, "t3a/m5a.large"),
        (0.1, 6, "t3a/m5a.large"),
        (2.1, 6, "c5a.xlarge"),
        (6, 16, "c5a.2xlarge"),
    ),
)
def test_get_instance_size(cpu, mem, expected):
    res = get_instance_size(cpu, mem)

    assert res is not None
    assert res["name"] == expected

对上面的代码运行pytest会导致:

============================= test session starts ==============================
platform linux -- Python 3.11.3, pytest-7.3.0, pluggy-1.0.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/lars/tmp/python
collecting ... collected 4 items

flavors.py::test_get_instance_size[1.8-6-t3a/m5a.large] PASSED           [ 25%]
flavors.py::test_get_instance_size[0.1-6-t3a/m5a.large] PASSED           [ 50%]
flavors.py::test_get_instance_size[2.1-6-c5a.xlarge] PASSED              [ 75%]
flavors.py::test_get_instance_size[6-16-c5a.2xlarge] PASSED              [100%]

============================== 4 passed in 0.01s ===============================

在上面的代码中,如果找不到匹配项,get_instance_size将引发StopIteration异常.

Python相关问答推荐

两极按组颠倒顺序

在有限数量的唯一字母的长字符串中,找到包含重复不超过k次的所有唯一字母的最长子字符串

重命名变量并使用载体中的字符串存储 Select 该变量

inspect_asm不给出输出

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

如何将我的位置与光强度数据匹配到折射图案曲线中?

Python中MongoDB的BSON时间戳

将HTML输出转换为表格中的问题

Chatgpt API不断返回错误:404未能从API获取响应

多处理代码在while循环中不工作

'discord.ext. commanders.cog没有属性监听器'

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

将输入管道传输到正在运行的Python脚本中

C#使用程序从Python中执行Exec文件

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

如何使用数组的最小条目拆分数组

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

如何在UserSerializer中添加显式字段?

字符串合并语法在哪里记录

合并帧,但不按合并键排序