为了收集执行时间,我使用不同的输入参数多次运行应用程序。
入参为6:v、n、m、b、p、c。
从概念上讲,我可以将结果看作一个多维数组,其中任何维数都是一个不同的参数:times[A][B][C][D][E][F]将使用参数v=A、n=B、m=C、b=D、p=E和c=F包含模拟的执行时间。
我希望能够修复这些参数中的一些,并迭代其他参数:
for A:
for C:
for F:
times[A][0][C][0][0][F]输入参数值是稀疏的,所以我应该使用字典而不是列表。
我在考虑使用一个字典来做整个事情,每次执行的时间都是这样表示的:
times = { A:{ B:{ C:{ D:{ E:{ F:{time} } } } } } }但是这个解决方案看起来一点也不优雅:构建整个结构并在其上迭代是一件痛苦的事情。
有没有更好的方法来处理我的数据?
发布于 2012-02-26 23:14:15
首先,如果您必须使用字典,为什么不只创建一个字典,使用元组对其进行索引?其次,使用itertools.product来避免麻烦的嵌套循环:
>>> import itertools
>>> d = {}
>>> for tup in itertools.product(range(5), repeat=2):
... d[tup] = tup
...
>>> d
{(1, 3): (1, 3), (3, 0): (3, 0), (2, 1): (2, 1), (0, 3): (0, 3), (4, 0): (4, 0),
(1, 2): (1, 2), (3, 3): (3, 3), (4, 4): (4, 4), (2, 2): (2, 2), (4, 1): (4, 1),
(1, 1): (1, 1), (3, 2): (3, 2), (0, 0): (0, 0), (0, 4): (0, 4), (1, 4): (1, 4),
(2, 3): (2, 3), (4, 2): (4, 2), (1, 0): (1, 0), (0, 1): (0, 1), (3, 1): (3, 1),
(2, 4): (2, 4), (2, 0): (2, 0), (4, 3): (4, 3), (3, 4): (3, 4), (0, 2): (0, 2)}但是,可能有更好的方法来创建稀疏数组。scipy提供了sparse matrices,但我相信它们只是二维的。
以下是您可能会发现有用的其他使用模式:
>>> for tup in itertools.product(range(5), repeat=2):
... if tup[0] == tup[1]:
... d[tup] = tup
...
>>> d
{(3, 3): (3, 3), (0, 0): (0, 0), (1, 1): (1, 1), (4, 4): (4, 4), (2, 2): (2, 2)}
>>> for tup in itertools.product(range(5), range(2)):
... print d.get(tup)
...
(0, 0)
None
None
(1, 1)
None
None
None
None
None
None为了不那么拐弯抹角,下面是保持一个变量常量的方法:只需将一个只包含一项的序列传递给itertools.product
>>> for tup in itertools.product(range(3), [2], range(3)):
... print tup
...
(0, 2, 0)
(0, 2, 1)
(0, 2, 2)
(1, 2, 0)
(1, 2, 1)
(1, 2, 2)
(2, 2, 0)
(2, 2, 1)
(2, 2, 2)发布于 2012-02-26 23:19:25
您可以使用元组中的参数组合作为键来创建一维字典,这会简单得多:
times[('v', 'n', 'm', 'b', 'p', 'c')] = valuehttps://stackoverflow.com/questions/9454179
复制相似问题