【问题标题】:Load a image.png in a few milliseconds在几毫秒内加载 image.png
【发布时间】:2019-11-27 07:04:30
【问题描述】:

我需要在不到 1 秒的时间内对图像执行一项功能。我有一个 1000x1000 图像的问题,只是将其作为矩阵加载到程序中,需要 1 秒。

我用来加载它的函数如下:

import png

def load(fname):

    with open(fname, mode='rb') as f:
        reader = png.Reader(file=f)
        w, h, png_img, _ = reader.asRGB8()
        img = []
        for line in png_img:
            l = []
            for i in range(0, len(line), 3):
                l+=[(line[i], line[i+1], line[i+2])]
            img+=[l]

        return img

我怎样才能修改它,使打开图像时花费的时间超过几毫秒?

重要提示:我无法导入除此之外的其他功能(这是大学练习,因此有规则-.-)。所以我必须自己买一个

【问题讨论】:

  • Reader 中是否有除 asRGB8 之外的函数可以调用,可能会更快?
  • 我不知道这个。但是,我仔细检查了代码,问题出在 for 循环
  • 这不仅仅是一个 for 循环,它是两个嵌套的。这是一个 O(n^2) 问题,总是很慢。
  • 问题规定了几毫秒的要求,但没有明确说明。我认为他们不知道毫秒是什么。这实际上是一个非常具体的要求,但似乎是随便使用的。因此问题很不清楚

标签: python python-3.x


【解决方案1】:

您可以使用PIL 为您执行此操作,它经过高度优化且速度很快

from PIL import Image

def load(path):
    return Image.open(path)

【讨论】:

  • 感谢您的建议。问题是这是一个大学练习,我被命令不要导入他们给我的图书馆以外的其他图书馆。我必须找到一种方法来使用我所拥有的东西,而目前我只有他们给我的这个“加载”功能。但是这个功能对于我必须尊重的时代来说并不好,我必须自己写一个。你能给我一些其他的建议吗?
【解决方案2】:

附加到list 本身就很慢 - 请阅读Shlemiel the painter’s algorithm。您可以将其替换为生成器表达式和切片。

    for line in png_img:
        img += list(zip(line[0::3], line[1::3], line[2::3])

【讨论】:

    【解决方案3】:

    我不确定是否可以在几毫秒内远程运行打开文件等的 python 脚本。在我的电脑上,最简单的程序需要几个 10ms

    如果不了解更多关于您的问题的具体情况和限制的原因,很难回答。您应该根据程序的实际运行方式来考虑您正在尝试做的事情,然后制定实现目标的策略。

    这里的总上下文是,您要求计算机:

    1. 运行 python,加载代码并解释它
    2. 加载任何你想使用的模块
    3. 找到您的图像文件并从磁盘读取它
    4. 赋予这些字节一些意义作为图像抽象 - 解析等这些字节
    5. 对图像进行某种变换或“工作”
    6. 以某种方式导出您的结果

    您需要弄清楚哪些步骤真正需要闪电般快速。在那之后,也许有人可以提出建议。

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2012-09-15
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多