【问题标题】:Suggestions for improving my method for finding the max value改进我找到最大值的方法的建议
【发布时间】:2023-03-31 19:20:02
【问题描述】:

我有一个名为 ISET 的集合;包含一长串 3 个字母的元素,例如:USA、BRA、CHN、....

我还有一本叫做高度的字典。该字典的键是 SET 的元素与某个 YEAR 字符串组合。例如:USA1991、USA1992、...、BRA1991、... ...

找到给定年份所有国家/地区的最大身高值的最佳方法是什么?

这是我一直在使用的:

YEAR = getuserselection()
for i in ISET:
    z = heights.get(i + YEAR, None)
    if z is None: continue
    if z > Max: Max = z

有什么改进的建议吗?

谢谢。

【问题讨论】:

  • 我建议你坚持一个更常见的命名约定(即PEP 8)。
  • 您对执行所需的时间有疑问吗?
  • @tkerwin:是的。我是。每次用户滑动某个年份滑块时它都会执行。对它的任何改进将不胜感激。谢谢。

标签: python optimization


【解决方案1】:

建议,未实际测量:使用从年份到 dicts 的映射 heights_per_year 将国家代码映射到高度。

year = getuserselection()
heights = heights_per_year[int(year)]
max_height = max(a.itervalues())

注意转换为int 以获得额外的速度(无需比较字符串)。

更好的是,让height_per_year 映射到降序排列的lists(国家代码、身高)对。

max_height = heights[0][1]

【讨论】:

    【解决方案2】:

    如果height 没有太大变化,请在创建或更新数据时缓存所需的统计信息。

    【讨论】:

    • +1:因为缓存是一种强大的技术,而且实现起来非常简单 (max_value[YEAR])。当然可能它不能在这种特定情况下使用......问题术语过于笼统,无法给出任何确定的建议。
    【解决方案3】:

    你的算法的改写可能是:

    YRNormalizer = max(heights.get(z+YEAR, -99999) for z in ISET)
    

    如果可以的话,你应该让 python 自己做循环......

    【讨论】:

    • 或者float('-inf),如果你想真的确定的话。
    • None,比任何数字都小<
    • @larsmans:你从哪里读到的?我知道不同类型之间的比较是一致但任意的(参见docs.python.org/library/stdtypes.html)。哪里说 None 保证比其他任何东西都少?
    • 我通过实验确定了这一点。我承认它不干净。任意表示 C 中的 UD 之类的东西吗?
    • @larsmans:它认为文档所说的只是意味着如果您发现一个字符串“小于”一个 int,那么至少在您退出 python 程序之前,任何字符串都将“小于” “任何整数。通过至少为该实现检查 CPython 2.7.1 的源代码,确实 None 小于任何东西,除非明确指定,因为 C 代码使其如此(参见 object.c 第 775 行)。当然,您可以通过定义适当的 __lt__ 运算符来制作比 None 更小的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多