用列表替换一周内的forloop

2024-04-24 10:59:14 发布

您现在位置:Python中文网/ 问答频道 /正文

如何用更有效的列表理解或类似的方法替换下面的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])

编辑:对不起,我应该说得更具体一点。我使用的是python2.7,除了诸如itertools之类的“核心”包之外,没有其他包。这段代码需要在我的脚本中运行~1M-1B次。你知道吗


Tags: 方法innumpypandas列表for客户机系统
2条回答

使用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))

当需要值时,将消耗时间。不会消耗明显的内存。你知道吗

您可以使用以下方法执行此操作:

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))

map提供的另一个答案虽然有趣,但由于重复调用lambdamap,因此开销会更大:

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

相关问题 更多 >