我想使用生成器优化我的应用程序,而不是创建 3 个列表,我想使用 2 个生成器。这是我的应用程序在当前版本中的简短方案:
1) 从二进制文件加载数据 -> 第一个列表
self.stream_data = [ struct.unpack(">H", data_file.read(2))[0] for foo in
xrange(self.columns*self.rows) ]
2)创建所谓的非零抑制数据(所有数据为零)->第二个列表
self.NZS_data = list()
for row in xrange(self.rows):
self.NZS_data.append( [ self.stream_data[column + row * self.rows ]
for column in xrange(self.columns) ] )
3)创建零抑制数据(坐标不为零)->第三个列表
self.ZS_data = list()
for row in xrange(self.rows):
for column in xrange(self.columns):
if self.NZS_data[row][column]:
self.ZS_data.append( [ column, row, self.NZS_data[row][column] ] )
(我知道这可以使用 itertools.product 压缩到单个列表理解中)
4) 将 ZS_data 列表保存到文件中。
我使用了 Python 的 cProfiler,大部分时间(除了读取和解包)都用于创建这两个(NZS_data 和 ZS_data)列表。因为我只需要它们来将数据保存到我一直在考虑使用 2 个生成器的文件中:
1) 创建一个用于读取文件的生成器 -> 第一个生成器
self.stream_data = ( struct.unpack(">H", data_file.read(2))[0] for foo in
xrange(self.columns*self.rows) )
2)创建 ZS_data 生成器(我真的不需要这个 NZS 数据)
self.ZS_data = ( [column, row, self.stream_data.next()]
for row, column in itertools.product(xrange(self.rows),
xrange(self.columns))
if self.stream_data.next() )
这当然不能正常工作,因为我从生成器中得到了两个不同的值。
3) 使用生成器将数据保存到文件中。
我想知道如何做到这一点。也许您对可能优化此应用程序有其他想法?
基于生成器的添加解决方案:
def create_ZS_data(self):
self.ZS_data = ( [column, row, self.stream_data[column + row * self.rows ]]
for row, column in itertools.product(xrange(self.rows), xrange(self.columns))
if self.stream_data[column + row * self.rows ] )
探查器信息:
ncalls tottime percall cumtime percall filename:lineno(function)
3257 1.117 0.000 71.598 0.022 decode_from_merlin.py:302(create_ZS_file)
463419 67.705 0.000 67.705 0.000 decode_from_merlin.py:86(<genexpr>)
乔恩的解决方案:
create_ZS_data(self):
self.ZS_data = list()
for rowno, cols in enumerate(self.stream_data[i:i+self.columns] for i in xrange(0, len(self.stream_data), self.columns)):
for colno, col in enumerate(cols):
# col == value, (rowno, colno) = index
if col:
self.ZS_data.append([colno, rowno, col])
探查器信息:
ncalls tottime percall cumtime percall filename:lineno(function)
3257 18.616 0.006 19.919 0.006 decode_from_merlin.py:83(create_ZS_data)