这个问题已经在这里有了答案 :
列表理解与生成器表达式的奇怪时间结果? (3个答案)
在Python中不带[]的列表理解 (7个答案)
4年前关闭。
因此,我从官方文档中获得了这些示例。
https://docs.python.org/2/library/timeit.html
是什么使第一个示例(生成器表达式)比第二个示例(列表理解)更慢?
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.8187260627746582
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
如果该str.join
方法不是列表或元组,则将其可迭代参数转换为列表。这样,联接逻辑就可以对项目进行多次迭代(通过一次传递来计算结果字符串的大小,然后进行第二次传递以实际复制数据)。
您可以在CPython源代码中看到这一点:
PyObject *
PyUnicode_Join(PyObject *separator, PyObject *seq)
{
/* lots of variable declarations at the start of the function omitted */
fseq = PySequence_Fast(seq, "can only join an iterable");
/* ... */
}
PySequence_Fast
C
API中的功能正是我所描述的。它将一个任意的Iterable转换为一个列表(基本上是通过调用list
它),除非它已经是一个列表或元组。
将生成器表达式转换为列表意味着生成器的通常好处(较小的内存占用量和发生短路的可能性)不适用于str.join
,因此生成器具有的(较小)额外开销使性能得以提高。更差。
问题内容: 什么时候应该使用生成器表达式,什么时候应该在中使用列表推导? 问题答案: John的答案很好(当你要迭代多次时,列表理解会更好)。但是,还应注意,如果要使用任何列表方法,都应使用列表。例如,以下代码将不起作用: 基本上,如果你要做的只是迭代一次,则使用生成器表达式。如果你要存储和使用生成的结果,那么列表理解可能会更好。 由于性能是选择彼此的最常见原因,所以我的建议是不要担心它,而只选择
我对Haskell有点陌生,我试图生成列表的所有连续子列表。 我目前有以下几点: 我知道上面的函数会在删除最后一个元素的情况下生成子列表,但我不知道如何完成伪代码。 我的伪代码基本上是, 拿着完整的清单,去掉尾巴。将(x:xs)的xs传递到列表子列表中 例如,xs=[1,2,3][xs]列表子列表(init xs)将生成[1,2,3,4]、[1,2,3]、[1,2]、[1]、[1]、[1],[1]
问题内容: 使用列表理解和生成器理解时,我得到不同的输出。这是预期的行为还是错误? 请考虑以下设置: 如果再运行以下代码,则会得到: 这是在python 3.6.0上: 问题答案: 在列表理解中,对表达式进行热切评估。在生成器表达式中,仅根据需要查找它们。 因此,当生成器表达式遍历时,它引用但仅在循环完成后查找,因此它仅对两个元组使用最新值。相比之下,列表推导会立即进行评估,因此它将创建第一个值为
问题内容: 这很有趣; 强制迭代器获取实际列表的速度比(理解)快得多。 这是真实的还是我的测试太简单了?下面是代码: 问题答案: 列表推导以Python字节码执行循环,就像常规循环一样。 该调用完全在C代码中进行迭代,这要快得多。 列表理解的字节码如下所示: 该指针大致给你执行循环的界限,让你有百万,和步骤在Python字节码估价循环执行。 另一方面,仅使用C API进行对象迭代即可直接从Iter
我正在使用Intelij Idea在JAVAFX中尝试一个简单的项目,因此我遇到了两个问题: 案例1: 当我将和和放在同一个文件夹: 案例2: 当我将放在文件夹中,并将和文件夹中: 1-SceneBuilder找不到Controller.java 谢谢
本文向大家介绍详解python列表生成式和列表生成式器区别,包括了详解python列表生成式和列表生成式器区别的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python(列表生成式/器)的具体代码,供大家参考,具体内容如下 一、列表生成式 二、小例子 三、字典生成式 四、列表生成器和列表生成式的区别 列表生成式: 会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多