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)
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |