用列表理解替换跨周的 for 循环
Replace for-loop across week with list comprehension
如何用更有效的列表理解或类似的东西替换以下 for
循环? Numpy
和 Pandas
不是一个选项,因为它们没有安装在客户端系统上,但也许 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 上,除了 "core" 软件包(例如 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))
需要取值的时候会消耗时间。不会消耗明显的内存。
如何用更有效的列表理解或类似的东西替换以下 for
循环? Numpy
和 Pandas
不是一个选项,因为它们没有安装在客户端系统上,但也许 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 上,除了 "core" 软件包(例如 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))
需要取值的时候会消耗时间。不会消耗明显的内存。