繁体   English   中英

使用列表理解替换整周的for循环

[英]Replace for-loop across week with list comprehension

如何使用更高效的列表推导或类似替换以下for循环? NumpyPandas不是一个选项,因为它们没有安装在客户端系统上,但也许itertools可能有用吗?

n_day_cells      = 24*60/240
week_matrix      = list()

for i in range(7):
    for j in range(n_day_cells):
        week_matrix.append([i,j,0])

编辑:对不起,我或许应该更具体一点。 我使用的是Python 2.7,没有其他软件包,而不是像itertools这样的“核心”软件包。 此代码需要在我的脚本中运行〜1M-1B次。

你可以通过使用:

week_matrix = [[i,j,0] for i in range(7) for j in range(n_day_cells)]

如果您的范围更大并且您使用的是Python2,则可能需要使用xrange而不是range来获取迭代器。


如果您真的想节省更多时间,请使用xrange,并创建元组列表而不是列表列表(Python2中的所有示例):

In [3]: %timeit [[i,j,0] for i in range(7) for j in range(n_day_cells)]
100000 loops, best of 3: 6.51 µs per loop

In [4]: %timeit [(i,j,0) for i in range(7) for j in range(n_day_cells)]
100000 loops, best of 3: 4.6 µs per loop

In [5]: %timeit [(i,j,0) for i in xrange(7) for j in xrange(n_day_cells)]
100000 loops, best of 3: 4.09 µs per loop

即使您想将它用作生成器,上面的最后一个应该是最快的选择:

week_matrix = ((i,j,0) for i in xrange(7) for j in xrange(n_day_cells))

地图提供的另一个答案虽然有趣,但由于重复调用lambda并调用map ,因此会产生更多开销:

In [6]: %timeit map(lambda x: [x//6, x%6, 0], xrange(n_day_cells*7))
100000 loops, best of 3: 10.6 µs per loop

使用map构建列表。

n_day_cells = 24*60/240
map(lambda x: [x//n_day_cells, x%n_day_cells, 0], xrange(n_day_cells*7))

或者使用itertools一种方式。

import itertools
a = itertools.imap(lambda x: [x//n_day_cells, x%n_day_cells, 0], xrange(n_day_cells*7))

需要值时将消耗时间。 不会消耗明显的记忆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM