bfl*_*tch 7 python integer iterator list listiterator
假设我有一个非常大的整数列表,占用了大量的内存.如果列表的整数是偶数增量,那么我可以很容易地将列表表示为占用相对没有内存的迭代器.但是对于更复杂的模式,将此列表表示为迭代器将变得更加困难.
是否有一个Python包可以分析整数列表并返回"优化"迭代器?或者我可以研究的方法来实现这个目标?
我的概念证明,使用lzma库(Python 2 的向后移植)压缩到内存。您可以使用磁盘上的文件代替内存缓冲区:
import io
import random
import struct
import sys
from backports import lzma
# Create array of integers with some duplicates
data = []
for i in xrange(0, 2000):
data += [random.randint(-sys.maxint, sys.maxint)] * random.randint(0, 500)
print('Uncompressed: {}'.format(len(data)))
buff = io.BytesIO()
fmt = 'i' # check https://docs.python.org/3/library/struct.html#format-characters
lzma_writer = lzma.LZMAFile(buff, 'wb')
for i in data:
lzma_writer.write(struct.pack(fmt, i))
lzma_writer.close()
print('Compressed: {}'.format(len(buff.getvalue())))
buff.seek(0)
lzma_reader = lzma.LZMAFile(buff, 'rb')
size_of = struct.calcsize(fmt)
def generate():
r = lzma_reader.read(size_of)
while len(r) != 0:
yield struct.unpack(fmt, r)[0]
r = lzma_reader.read(size_of)
# Test if it is same array
res = list(generate())
print res == data
Run Code Online (Sandbox Code Playgroud)
结果:
Uncompressed: 496225
Compressed: 11568
True
Run Code Online (Sandbox Code Playgroud)