1

python新手(非常酷),第一个问题。我正在读取一个 50+ mb 的 ascii 文件,扫描属性标签并将数据解析为一个 numpy 数组。我在整个循环中放置了计时报告,并找到了罪魁祸首,即使用 np.append() 的 while 循环。想知道有没有更快的方法。

这是一个带有用于调试的假数据的示例输入文件格式:

...标签参数字符名称“Poro”数组浮点数据100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38,8071 72 73 74 75 76 77 78 79 80 86 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 尾标 ...

这是代码片段,其中 350k 元素数组的 while 循环需要 70 秒:

def readParameter(self, parameterName):
    startTime = time.time()
    intervalTime = time.time()
    token = "tag parameter"
    self.inputBuffer.seek(0)
    for lineno, line in enumerate(self.inputBuffer, 1):
        if token in line:
            line = self.inputBuffer.next().replace('"', '').split()
            elapsedTime = time.time() - intervalTime
            logging.debug("    Time to readParameter find token: " + str(elapsedTime))
            intervalTime = time.time()
            if line[2] == parameterName:
                line = self.inputBuffer.next()
                line = self.inputBuffer.next()
                np.parameterArray = np.fromstring(line, dtype=float, sep=" ")
                line = self.inputBuffer.next()

                **while not "endtag" in line:
                    np.parameterArray = np.append(np.parameterArray, np.fromstring(line, dtype=float, sep=" "))
                    line = self.inputBuffer.next()**

                elapsedTime = time.time() - startTime
                logging.debug("    Time to readParameter load array: " + str(elapsedTime))
                break
    elapsedTime = time.time() - startTime
    logging.debug("    Time to readParameter: " + str(elapsedTime))
    logging.debug(np.parameterArray)
    np.parameterArray = self.make3D(np.parameterArray)
    return np.parameterArray

谢谢,杰夫

4

1 回答 1

4

追加到数组需要调整数组的大小,这通常需要分配一个足够大的新内存块来容纳新数组,将现有数组复制到新位置,并释放它曾经使用的内存。所有这些操作都很昂贵,而且您正在为每个元素执行这些操作。使用 350k 个元素,它基本上是垃圾收集器内存碎片压力测试。

预先分配您的数组。你有 count 参数,所以创建一个大小的数组,在你的循环中,只需将新解析的元素分配给数组中的下一个位置,而不是附加它。您必须保留自己的计数器来计算已填充的元素数量。(您可以改为遍历空白数组的元素并替换它们,但这会使添加错误处理有点棘手。)

于 2012-08-28T05:54:33.603 回答