a = [(1,2),(3,1),(4,4),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5),(5,5)]
# Quite a lot tuples in the list, 6 digits~
# I want to split it into rows and columns.
rows = 5
cols = 5
Data structure is
rows and cols are the index for the bit list
[rows, cols, (data)]
我使用循环来执行此操作,但处理大量元组需要很长时间。
processed_data = []
index = 0
for h in range(0, rows - 1):
for w in range(0, cols - 1):
li = []
li = [h, w, a[index]]
processed_data.append(li)
index += 1
此操作耗时太长,有没有办法进行优化?非常感谢!
答案 0 :(得分:2)
我根本不清楚你想要什么,但是这里以更优化的方式拍摄同一个循环:
import itertools as it
index = it.count(0)
processed_data = [[h, w, a[next(index)]]
for h in xrange(0, rows - 1)
for w in xrange(0, cols - 1)]
或者,因为您已经导入了itertools,
index = ite.count(0)
indices = it.product(xrange(0, rows-1), xrange(0, cols-1))
processed_data = [[h, w, a[next(index)]] for h, w in indices]
这些更快的原因是它们使用列表推导而不是for
循环。列表推导有自己的操作码LIST_APPEND,它直接路由到正在构造的列表上的append
方法。在正常的for
循环中,虚拟机必须经历在列表对象上查找append
方法的整个过程,这种方法相当昂贵。
此外,itertools是用C实现的,所以如果同一算法的速度不快,那么itertools就会出现错误。
答案 1 :(得分:2)
好吧,如果你真的想要指数那么糟糕......
[divmod(i, cols) + (x,) for i, x in itertools.izip(itertools.count(), a)]
答案 2 :(得分:0)