【问题标题】:Python: what is the most efficient way to print a list of lists?Python:打印列表的最有效方法是什么?
【发布时间】:2019-10-05 08:34:12
【问题描述】:

具体来说,我有一个这样的列表:[[1,2,3], [4,5,6], [7,8,9], [10]],我想这样打印出来:

1 2 3
4 5 6
7 8 9
10

我认为这样的事情会非常有效:

    a = [[1,2,3], [4,5,6], [7,8,9], [10]]    
    for sublist in a:
        print(*sublist)

但在非常大的情况下,它并没有我希望的那么有效。我正在处理数千个子列表,每个子列表本身都是数千个数字。

我可能已经处理了子列表,因此数字是字符串或整数,这部分无关紧要。我只需要让我的代码运行得更快,而目前,打印是最耗时的。

【问题讨论】:

  • 打印“数千个子列表数千个数字”有什么意义?
  • 您也可以使用间隔来保存它们,例如[[1,3],[4,6],[7,9],[10]
  • @DYZ 不是很明显,我知道 - 但这些是 compsci 学生必须跳过的各种障碍!
  • @DeveshKumarSingh 你能备份你的答案吗?我重新加载了页面,它消失了。我不是那个反对它的人。

标签: python list performance printing nested-lists


【解决方案1】:

可以说,打印的大部分开销来自“设置”和“拆除”打印逻辑。因此,如果将所有内容组合成一个长字符串,然后打印出来,应该会快很多:

print('\n'.join(' '.join(map(str, sub)) for sub in a))

我的时间分析结果,给出以下数据和三个解决方案:

a = [list(range(10)), list(range(10, 20)), list(range(20, 30))]    

# OP's original solution
%timeit for sublist in a: print(*sublist)
# 1.74 ms ± 89.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# another answer's solution
%timeit res = [' '.join(map(str,item)) for item in a]; print(*res, sep='\n')
# 191 µs ± 17.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# my solution
%timeit print('\n'.join(' '.join(map(str, sub)) for sub in a))
# 78.2 µs ± 5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

【讨论】:

  • @DeveshKumarSingh 根据我的测试,why 加入的解释以及外部的 join 调用会导致 2-4 倍的加速。
  • @DeveshKumarSingh 别担心 :)
【解决方案2】:

首先将内部列表作为一个字符串加入,以创建一个字符串列表。

然后使用迭代器解包解包内部列表,并使用\n作为分隔符。

li = [[1,2,3], [4,5,6], [7,8,9], [10]]

#Join the inner lists as a string to make a list of strings
#Print them using newline separator
print(*[' '.join(map(str,item)) for item in li], sep='\n')

输出是

1 2 3
4 5 6
7 8 9
10

此外,将thousands of sublists, and each of those are themselves thousands of numbers 打印为评论中提到的@DYZ 是没有意义的,您可以使用说一个间隔来保存它们,例如[[1,3],[4,6],[7,9],[10]

【讨论】:

  • 感谢您的提示。这确实减少了我的运行时间。顺便说一句,您忘记了代码中、打印语句中、列表理解之前的 *。
  • 已修复,感谢您告诉我。 @SonicProtein。如果答案对你有帮助。请考虑将其标记为已接受 :) 此外,如果您只想使用不需要 join[] 打印子列表,但不确定您是否想要这样
  • 列表列表来自一个非常大的有向图,所以不幸的是我不能只使用这样的范围......对不起,我应该在问题中更清楚。我会把这个问题留待更长时间,但我已经支持你了。
  • 当然,我认为大多数其他海报都会暗示你不要使用这样的数组,尽管就像上面的 cmets 之一,或者也许是时候重新定义那个有向图了,我也不确定你为什么要首先打印它们@SonicProtein :)
  • 有什么比使用这样的数组更好的方法的想法吗?我首先操作一个有向图,然后打印输出。打印所花费的时间是迄今为止最长的,比图形操作要长得多,这就是为什么我在考虑如何优化打印的原因——但正如你所说,我可能一开始就错了,应该考虑不使用这样的数组。问题是,这是我在 uni 的班级正在研究的一个问题,显然可以在更短的时间内完成它,同时仍然使用列表列表。 (这就是为什么我需要打印出这么多输出 - 它是为 uni)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多