【问题标题】:Faster way to build list from array of floats从浮点数组构建列表的更快方法
【发布时间】:2016-03-03 23:29:02
【问题描述】:

我是 python 新手,正在尝试生成数组元素所有可能组合的列表。这是我的尝试:

Ks = (np.arange(Low_Lim[2], (High_Lim[2]+1)) * grid_space + OFFSETS[2])

Js = (np.arange(Low_Lim[1], (High_Lim[1]+1)) * grid_space + OFFSETS[1])

Is = (np.arange(Low_Lim[0], (High_Lim[0]+1)) * grid_space + OFFSETS[0])

Points = [(a, b, c) for a in Is for b in Js for c in Ks]

但这花费的时间比我想要的要长。有没有比我这里更快的方法?它看起来像 itertools.combination 的可能性?

【问题讨论】:

标签: python numpy


【解决方案1】:

这应该会得到相同的结果

list(itertools.product(Is, Js, Ks))

【讨论】:

  • 谢谢。这更快!
【解决方案2】:

根据你想如何使用你的列表,你可能想也可能不想考虑使用生成器,这样你就不必预先支付计算成本。

from timeit import Timer
setup_1 = """
Is = range(1000)
Js = range(300)
Ks = range(100)
"""
exec_1 = """
[(a, b, c) for a in Is for b in Js for c in Ks]
"""
exec_2 = """
list(itertools.product(Is, Js, Ks))
"""
t_1 = Timer(exec_1, setup_1)
print("Regular list comprehension/Regular loop: %r" % t_1.timeit(1))
t_2 = Timer(exec_2, setup_1)
print("Itertools.product/Regular loop: %r" % t_2.timeit(1))

setup_2 = """
Is = (i for i in range(1000))
Js = (i for i in range(300))
Ks = (i for i in range(100))
"""

t_3 = Timer(exec_1, setup_2)
print("Regular list comprehension/Generator: %r" % t_3.timeit(1))
t_4 = Timer(exec_2, setup_2)
print("Itertools.product/Generator: %r" % t_4.timeit(1))

运行上面的代码给了我以下计算/运行时间。请注意,itertools 评估了生成器。

Regular list comprehension/Regular loop: 3.8275507260113955
Itertools.product/Regular loop: 2.764477888995316
Regular list comprehension/Generator: 0.00015614699805155396
Itertools.product/Generator: 2.8045845669985283

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2023-01-29
    • 2010-10-23
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多