用 O(1) 空间逐行读取数字

Kel*_*ndy 5 python memory space-complexity

许多编码挑战在同一行中有多个数字,通常第一行告诉多数字行中有多少个数字:

4
31 415 9 26
Run Code Online (Sandbox Code Playgroud)

通常我只是读取整行,然后.split()将字符串映射到数字。

但是有没有一种好方法可以一次读取整行,而是一次读取一个数字呢?为了节省内存,要么因为我不能或不想整行读入内存。我只想使用 O(1) 空间(假设数字很小/有界,所以它们的大小是 O(1) )。不必绝对最小,例如,如果解决方案在内部一次读取完整的 4 KB 内存页,那没关系,仍然是 O(1) 并且相对较小。对于用例,请考虑一行上有数百万个数字,并且内存限制比方说低于 1 MB。

在 C++ 中我会这样做:

4
31 415 9 26
Run Code Online (Sandbox Code Playgroud)

我编写了这个生成器,它接受一个文件对象并为我提供一个字符串迭代器。对于上面的示例,它生成字符串'4''31''415''9''26'它一次读取一个字符,并按照以下确定的空格字符进行分割.isspace()

def split(file):
    value = []
    while char := file.read(1):
        if char.isspace():
            if value:
                yield ''.join(value)
            value.clear()
        else:
            value.append(char)
    if value:
        yield ''.join(value)
Run Code Online (Sandbox Code Playgroud)

但这当然是极其复杂和缓慢的,我什至不知道这种str.isspace用法是否等同于str.split空白。它只是说明了实现我想要的目标的一种方法。

编辑:这是一种更简单的方法,但仍然比我想要的更复杂和缓慢。我正在寻找一些内置的方法,以 C 速度为我完成低级工作。

from itertools import groupby

def split(file):
    groups = groupby(iter(lambda: file.read(1), ''), str.isspace)
    for isspace, chars in groups:
        if not isspace:
            yield ''.join(chars)
Run Code Online (Sandbox Code Playgroud)