我只需要使用python内置的^{}来实现这一点,它看起来并不复杂,在我的测试中也没有那么慢:from itertools import product
for x in product(range(3), range(2)):
rg = reduce(lambda result, index: result[index], x, lst)
value = rg[0]
如果您担心来自reduce的计时惩罚,您可以使用for循环来代替:
^{pr2}$
在所有情况下,这将比手动索引慢,因为for循环将需要额外的操作来确定停止条件。问题是,与以往一样,速度优化是否值得您为任意深度规范的灵活性。在
至于为什么要使用reduce与for,JavaScript社区中存在一个持续的风格争论,即是否应该在Array上使用reduce、map、filter函数,还是使用{}循环版本,因为这样更快,您可能需要参考这一争论来选择属于哪一方。在
使用for循环计时:In [22]: stmt = '''
...: from itertools import product
...: def go():
...: lst = [[[1], [2]], [[3, 3], [4]], [[5], [6,6,6]]]
...: for x in product(range(3), range(2)):
...: # rg = reduce(lambda result, index: result[index], x, lst)
...: value = lst
...: for index in x:
...: value = value[index]
...: value = value[0]
...: # value = lst[x[0]][x[1]][0]
...: '''
In [23]: timeit(setup=stmt, stmt='go()', number=1000000)
Out[23]: 4.003296852111816
使用reduce计时:In [18]: stmt = '''
...: from itertools import product
...: def go():
...: lst = [[[1], [2]], [[3, 3], [4]], [[5], [6,6,6]]]
...: for x in product(range(3), range(2)):
...: rg = reduce(lambda result, index: result[index], x, lst)
...: value = rg[0]
...: # value = lst[x[0]][x[1]][0]
...: '''
In [19]: timeit(setup=stmt, stmt='go()', number=1000000)
Out[19]: 6.164631128311157
手动分度计时:In [16]: stmt = '''
...: from itertools import product
...: def go():
...: lst = [[[1], [2]], [[3, 3], [4]], [[5], [6,6,6]]]
...: for x in product(range(3), range(2)):
...: # rg = reduce(lambda result, index: result[index], x, lst)
...: value = lst[x[0]][x[1]][0]
...: '''
In [17]: timeit(setup=stmt, stmt='go()', number=1000000)
Out[17]: 3.633723020553589
这篇博客探讨了在Python中对列表进行多级索引操作的不同方法,包括使用`reduce`、for循环和手动索引。通过性能测试,发现手动索引通常比使用`reduce`或for循环更快,但在代码简洁性和灵活性之间需要权衡。测试结果显示,手动索引的执行时间最短。

被折叠的 条评论
为什么被折叠?



