|
|
1
45
第一件事
the full source code version 2.7 和 version 3.1.2 .
:如
answer by aaronasterling
,变量
|
|
|
2
19
最简单的方法是使用
我想这是因为
|
|
|
3
12
这是一个巨大的好处。因为sorted不会影响传入的序列,所以它必须对其进行复制。如果它从生成器表达式中生成列表,则只生成一个列表。如果传入列表理解,则首先生成该列表,然后
这反映在
引用于 Sven Marnach's answer . 本质上,这将无条件地复制传递给它的任何序列。 |
|
|
4
11
如果不知道序列的所有元素,就无法对序列进行排序,因此任何生成器都将传递给
|
|
|
5
8
Python使用Timsort。Timsort需要知道前面的元素总数,才能计算minrun参数。因此,正如Sven所报告的,当给定一个生成器时,sorted所做的第一件事就是将它变成一个列表。 也就是说,编写Timsort的增量版本是可能的,它消耗生成器中的值的速度会更慢-您只需在开始之前修复minrun,并接受在结束时进行一些不平衡合并的痛苦。Timsort分两个阶段工作。第一个阶段涉及整个数组的传递,标识运行并执行插入排序,以便在数据无序的地方运行。运行查找和插入排序本质上都是增量的。第二个阶段涉及排序运行的合并;这与现在完全一样。 不过,我觉得这没什么意义。也许这会使内存管理变得更容易,因为不必从生成器读取到不断增长的数组中(正如我毫无根据地假设当前实现所做的那样),您可以将每次运行读取到一个小缓冲区中,然后在最后只分配一次最终大小的缓冲区。然而,这将涉及在内存中同时有2N个数组槽,而一个增长的数组可以用1.5N来完成,如果它在增长时加倍。所以,可能不是个好主意。 |
|
|
6
3
|
|
|
7
3
直接地 ,它 更快;大部分开销可能是代码创建自己的列表或生成器:
|
|
|
8
1
如果性能很重要,为什么不按生成器生成的数据进行处理,并对迭代结果应用排序呢?当然,这只能在迭代之间没有因果条件的情况下使用(即排序迭代的数据不需要进行排序迭代的计算)。 |